添加到包含模式的行的末尾 – 使用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