Bash:如果存在,则替换4个字符串

时间:2016-08-17 08:04:59

标签: bash sed

我有一个有时

的字符串
xxx.11_222_33_44_555.yyy

有时候

xxx.11_222_33_44.yyy

我想: 检查是否有4个_的遮挡物(想出了怎么做)。 如果是这样 - 删除字符串的_3333字符串更改,可以是任意数字),所以我留下了xxx.11_222_44.yyy

4 个答案:

答案 0 :(得分:1)

使用sed:

sed 's/\(_[0-9]*\)_[0-9]*\(_[0-9]*_[0-9]*\)/\1\2/'

它匹配四个下划线,并用所需的部分替换整个。

试运行:

$ echo "xxx.11_222_33_44_555.yyy" | sed 's/\(_[0-9]*\)_[0-9]*\(_[0-9]*_[0-9]*\)/\1\2/'
xxx.11_222_44_555.yyy

$ echo "xxx.11_222_33_44.yyy" | sed 's/\(_[0-9]*\)_[0-9]*\(_[0-9]*_[0-9]*\)/\1\2/'
xxx.11_222_33_44.yyy

答案 1 :(得分:0)

也许是这样的

echo "xxx.11_222_33_44.yyy" | sed -e's/\.\([0-9]\+\)_\([0-9]\+\)_\([0-9]\+\)_\([0-9]\+\)\./.\1_\2_\4./'

检查两个点之间是否有4组由_分隔的数字,如果是,则省略第三组

答案 2 :(得分:0)

试试这个;

echo "xxx.11_222_33_44_555.yyy"  | awk -F'_' 'NF>4{print $1"_"$2"_"$4"_"$5};'

答案 3 :(得分:0)

使用perl和Lookahead和Lookbehind

的解决方案
$ a="xxx.11_222_33_44_555.yyy"
$ perl -pe 's/\.\d+_\d+_\K\d+_(?=\d+_\d+\.)//' <<< "$a"
xxx.11_222_44_555.yyy