如何添加到包含sed或awk模式的行的末尾?


89

这是示例文件:

somestuff...
all: thing otherthing
some other stuff

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

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

Answers:


166

这对我有用

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

第一部分是要查找的模式,第二部分是$用于行尾的普通sed的替换。

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

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

或者您可以将其重定向到另一个文件

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

只需添加一些内容即可换行,替换是正确的方法。
zhy

10

这应该为你工作

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

使用s命令(替代),您可以搜索满足正则表达式的行。在上面的命令中,&代表匹配的字符串。


9

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

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

说明

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

测试

对于给定的输入,它返回:

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

请注意,您还可以提供文本以附加到变量中:

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

在Solaris上,您会收到以下错误:awk: can't set $0
ceving 2013年

@ceving然后可以使用/usr/xpg4/bin/awk“好” awk。
fedorqui'SO停止伤害

6

在bash中:

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

6

这是使用sed的另一个简单解决方案。

$ sed -i 's/all.*/& anotherthing/g' filename.txt

说明:

all。*表示所有行均以“ all”开头。

&表示匹配项(即以“ all”开头的完整行)

然后sed将前者替换为后者,并附加“ otherthing”一词


3

用awk解决方案:

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

简单:如果该行以all打印该行开头并加上“其他”,则仅打印该行。


4
您可以将其缩短为:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
glenn jackman 2012年

2
@Prometheus,一个awk脚本由condition {actions}成对组成。如果condition省略,则对每个记录执行操作。如果{actions}省略,并且条件求值为true(数字就是这种情况1),则默认操作是打印当前记录。
格伦·杰克曼(Glenn Jackman)2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.