我有一个与此类似的文件:
[one]
[two]
[three]
[four = something]
我想/mame/
在方括号中的单词前面添加,除非=
该行上有符号
因此,以上内容将是
[/mame/one]
[/mame/two]
[/mame/three]
[four = something]
我尝试过这个:
sed -i 's|\[*]|\mame/\]|g' afile
但一切都是错误的,被/mame/
添加到现有单词的末尾
我究竟做错了什么?
答案1
一些东西:
*
在正则表达式中是一个量词;如果你想要类似于 shell 通配符的行为,你需要.*
(任何单个字符,零次或多次).*
贪婪匹配,所以如果你想排除=
诸如结束之类的东西]
的东西,你需要明确地这样做 - 这就是你需要的非-文字[
和]
m
不需要在 LHS(正则表达式模式)或 RHS(替换)上进行转义如果你想要重复使用,你需要一个捕获组(又名反向引用)括号内的文本
你不需要
g
除非你有多场比赛,否则每行
所以
$ sed -r 's|\[([^=[]*)\]|[/mame/\1]|' file
[/mame/one]
[/mame/two]
[/mame/three]
[four = something]
使用 Perl(也具有-i
就地模式),您可以使用环视和惰性(非贪婪)匹配:
$ perl -pe 's{(?<=\[)([^=]*?)(?=])}{/mame/$1}' file
[/mame/one]
[/mame/two]
[/mame/three]
[four = something]
答案2
我建议这样做:
sed '/=/!s;^\[;[/mame/;' file
输出:
[/mame/one]
[/mame/two]
[/mame/three]
[four = something]
答案3
只需两步即可更简单
- 添加 mame 到全部
sed -i 's/\[/\[\/mame\//' m.txt
- 从 = 中删除 mame
sed -i 's/\/mame\/\(.* =\)/\1/' m.txt
或者
sed 's/\[/\[\/mame\//' m.txt | sed 's/\/mame\/\(.* =\)/\1/'