正则表达式sed问题

时间:2018-05-21 11:36:28

标签: regex linux sed makefile

我的sed表达看起来像belos:

sed -i "s/-D CONSOLELOG /-D CONSOLELOG  -fPIC /g" makefile.init

makefile.init

 CFLAGS = -std=c99 -rdynamic -g -Wall -Wno-write-strings -D CONSOLELOG  

第一次运行后的输出(如预期的那样)

CFLAGS = -std=c99 -rdynamic -g -Wall -Wno-write-strings -D CONSOLELOG  -fPIC

第二次运行(注意最后的额外fPIC)

CFLAGS = -std=c99 -rdynamic -g -Wall -Wno-write-strings -D CONSOLELOG  -fPIC -fPIC

我需要修改我的sed表达式以获得(1)中的输出而不管它执行的次数

2 个答案:

答案 0 :(得分:3)

这可能适合你(GNU sed):

sed -ri 's/-D CONSOLELOG (-fPIC )?$/&-fPIC /' file

这将在-fPIC选项后插入最多2个-D CONSOLELOG个选项。

答案 1 :(得分:2)

为了说明目的,示例已更改

$ cat ip.txt 
42 foo baz 
ijk baz xyz
$ sed -i 's/baz $/&123/' ip.txt
$ cat ip.txt
42 foo baz 123
ijk baz xyz

$ # further runs won't change input
$ sed -i 's/baz $/&123/' ip.txt
$ cat ip.txt
42 foo baz 123
ijk baz xyz
  • $是一个元字符,用于确保仅在行尾
  • 进行匹配
  • 所以,该行中其他位置的匹配项不会更改,因此再次应用该命令不会导致重复
  • 替换部分中的
  • &是对搜索部分中的整个匹配字符串的反向引用
  • 因为在行尾只能有一个匹配,所以不需要g修饰符


替换行中的任何位置(假设每行只有一个匹配)

$ cat ip.txt 
42 foo baz 
ijk baz xyz
$ sed -i '/baz 123/! s/baz /&123/' ip.txt
$ cat ip.txt
42 foo baz 123
ijk baz 123xyz

$ # further runs won't change input
$ sed -i '/baz 123/! s/baz /&123/' ip.txt
$ cat ip.txt
42 foo baz 123
ijk baz 123xyz
  • sed命令可以使用addressing
  • 进行限定
  • 此处,/baz 123/!表示 行<{1}}


进一步阅读:Difference between single and double quotes in Bash