我有一个文件try.txt
,如下所示:
(SOME_PRINT): [a] content
(SOME_PRINT): [a] [b] content
如果我在文件的一行的开头有这个模式:(SOME_PRINT): [<word>]
(其中<word>
只是字母和数字的组合),所以我想用{{替换它' 1}}。
对于上面的文件,我想找到一个命令,它的执行将使文件成为:
(OTHER_PRINT):
我尝试运行(OTHER_PRINT): content
(OTHER_PRINT): [b] content
,并获得此输出:
sed -r -i 's/^\(SOME_PRINT\)\: \[.*\] /\(OTHER_PRINT\)\: /' try.txt
你能解释为什么(OTHER_PRINT): content
(OTHER_PRINT): content
消失了吗?
答案 0 :(得分:1)
只需改变你的正则表达式:
sed -r -i 's/^\(SOME_PRINT\)\: \[[a-zA-Z0-9]\] /\(OTHER_PRINT\)\: /' try.txt
您的错误是您的正则表达式的这一部分不够精确:\[.*\]
[a] [b]
可以通过\[.*\]
解决方法是仅指定方括号中可以找到的字符。正如您所说的只有字母数字字符,这可以通过此选择器完成:[a-ZA-Z0-9]
。
另一种解决方案是从字符中排除结束方括号。
我经常使用https://regex101.com/尝试我的正则表达式。它非常酷,易于理解。