假设有一个文本文件如下:
Hello world
types=""
Mario
types="Game"
我想做的就是找到第一个出现的单词type=""
并附加该单词program
我想要的输出:
Hello world
types="program"
Mario
types="Game"
我需要在 Unix shell 脚本中使用。
我尝试过的:
sed -i '1,/types=\"\"/s/types=\"\"/types=\"program\"/' filename
该命令仅插入而不追加。尝试添加a\
但仍然不起作用。
答案1
{ sed '/types=""/!b
s/"/&program/;q'
cat
} <infile >outfile
POSIXsed
会将其输入文件偏移量准确地保留在其q
输入位置。不过,对于 GNU,sed
您可能需要这个-u
选项。
答案2
您可以使用i
插入,然后d
删除该行,然后q
退出:
~$ sed '/types=""/{i\
> types="program"
> d;q}' f
Hello world
types="program"
Mario
types="Game"
以下不起作用(感谢@mikeserv):或者只是c
更改线路并q
退出:
~$ sed '/types=""/{c\
> types="program"
> q}' f
Hello world
types="program"
Mario
types="Game"
(当然,保留-i
for 的位置)
答案3
POSIXly:
$ sed -e '1,/types=""/{
//s/"/&program/
}
' file
奇怪的是上面在 GNU sed 上失败了,你需要:
$ sed -e '1,/types=""/{
/types=""/s/"/&program/
}
' file
types=""
如果出现在第一行,以上所有内容都会失败。在这种情况下,您可以使用 GNU sed 或 BSD sed 0,/pattern/
:
$ sed -e '0,/types=""/{
/types=""/s/"/&program/
}
' file
或 POSIX 之一:
$ sed -e '/types=""/{
s/"/&program/
:1
n
b1
}
' file