添加到包含模式的行的末尾 – 使用sed或awk

这是示例文件

somestuff... all: thing otherthing some other stuff 

我想要做的就是添加到以all:开头的行all:像这样:

 somestuff... all: thing otherthing anotherthing some other stuff 

我可能可以使用sed来做这个,但是我并不擅长sed,所以有人可以帮忙吗?

这对我有用

 sed '/^all:/ s/$/ anotherthing/' file 

第一部分是find的模式,第二部分是使用$作为行结尾的普通sed的replace。

如果您想在此过程中更改文件,请使用-i选项

 sed -i '/^all:/ s/$/ anotherthing/' file 

或者你可以redirect到另一个文件

 sed '/^all:/ s/$/ anotherthing/' file > output 

这应该适合你

 sed -e 's_^all: .*_& anotherthing_' 

使用s命令(替代)可以search满足正则expression式的行。 在上面的命令中, &代表匹配的string。

如果符合条件,可以在awk中将文本附加到$0

 awk '/^all:/ {$0=$0" anotherthing"} 1' file 

说明

  • /patt/ {...}如果行匹配patt给出的模式,则执行{}描述的操作。
  • 在这种情况下: /^all:/ {$0=$0" anotherthing"}如果行开始(用^表示),则将all:行添加到anotherthing中。
  • 1作为一个真实的条件,触发awk的默认行为:打印当前行( print $0 )。 这将始终发生,因此它将打印原始行或修改的行。

testing

对于你给定的input,它返回:

 somestuff... all: thing otherthing anotherthing some other stuff 

注意你也可以提供文本来追加一个variables:

 $ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file somestuff... all: thing otherthing EXTRA TEXT some other stuff 

用awk解决scheme:

 awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file 

简单地说:如果行开始打印行加“anotherthing”,否则只打印行。

在bash中:

 while read -r line ; do [[ $line == all:* ]] && line+=" anotherthing" echo "$line" done < filename