sed - 查找并替换模式但排除特定的数字序列

sed - 查找并替换模式但排除特定的数字序列

所以我发表以下声明:

echo "1234 The few, 7777 the brave." | sed 's/[0-9]\{4\}/(&)/g'

哪个输出

(1234) The few, (7777) the brave.

但是我想从模式匹配中排除 7777。

(1234) The few, 7777 the brave.

问题:如何排除 7777 模式匹配?

答案1

sed 没有可以让您很好地跳过 7777 的先行表达式。但是您可以通过将所有 7777 匹配“移开”到您确定输入中任何地方都不会出现的某个字符串来笨拙地做到这一点。

例如,如果您知道输入中未出现#7#7#7#7#,则可以使用:

echo "1234 The few, 7777 the brave." | \
sed -e 's/7777/#7#7#7#7#/g' -e 's/[0-9]\{4\}/(&)/g' -e 's/#7#7#7#7#/7777/g'

要得到

(1234) The few, 7777 the brave.

答案2

或者:

echo "1234 The few, 7777 the brave." | sed -e 's/\([0-9]\{4\}\)/(\1)/g' -e 's/(\(7\{4\}\))/\1/g'
(1234) The few, 7777 the brave.

echo "A 1717 B 7777 C 7676 D" | sed -e 's/\([0-9]\{4\}\)/(\1)/g' -e 's/(\(7\{4\}\))/\1/g'
A (1717) B 7777 C (7676) D

echo "7777 foo 1234 bar" | sed -e 's/\([0-9]\{4\}\)/(\1)/g' -e 's/(\(7\{4\}\))/\1/g'
7777 foo (1234) bar

相关内容