我的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)中的输出而不管它执行的次数
答案 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}}