![在模式的第一个字母后插入文本](https://linux22.com/image/191710/%E5%9C%A8%E6%A8%A1%E5%BC%8F%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%AD%97%E6%AF%8D%E5%90%8E%E6%8F%92%E5%85%A5%E6%96%87%E6%9C%AC.png)
如何/foo/
在且仅在开括号之后插入?
(bar)
应该成为
(/foo/bar)
而(/baz/bar)
应该不是变得(/baz/foo/bar)
答案1
在这个简单的例子中,你可以尝试
sed 's,(bar,(/foo/bar,'
答案2
一种复杂的方式,假设你想添加/foo/
到任何括号之间的模式:
$ echo '(bar)' | sed 's;(/*\([^(]*\);(/foo/\1;'
(/foo/bar)
$ echo '(/bar/baz)' | sed 's;(/*\([^(]*\);(/foo/\1;'
(/foo/bar/baz)
该命令说:
选择括号之间的内容并捕获它(可以以斜线开头/
),然后将(
or替换(/
为/foo/
捕获的模式。
答案3
使用awk
:
awk '/\(bar/ {sub(/bar/, "/foo/bar"); }1' input
和sed
:
sed -E 's%([(])(bar)%\1/foo/\2%' input
这使用反向引用 \1 for(
和 \2 for bar
。