将文本插入到括号内的现有文本中

将文本插入到括号内的现有文本中

我有一个与此类似的文件:

[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

只需两步即可更简单

  1. 添加 mame 到全部 sed -i 's/\[/\[\/mame\//' m.txt
  2. 从 = 中删除 mame sed -i 's/\/mame\/\(.* =\)/\1/' m.txt

或者 sed 's/\[/\[\/mame\//' m.txt | sed 's/\/mame\/\(.* =\)/\1/'

相关内容