如何使用 sed 保留替换字符串的内容

如何使用 sed 保留替换字符串的内容

我试图用它sed来替换一行文本,以保持找到的文本完整,并在其末尾添加一个冒号。

具体来说,在一个文件中有很多这种格式的行

CWMPVendorXEventCodeCutOff              20
CWMP<othertitle>              20

我想把它们变成这种格式

CWMPVendorXEventCodeCutOff:              20
CWMP<othertitle>:                        20

我现在就在这个

sed 's_CWMP.*?\\s_CWMP.*?:_g'

但这显然不起作用。我该怎么做呢?

答案1

sed 's/\<CWMP[^[:blank:]]*/&:/' file

替换部分中的&将会被替换为与替换的正则表达式部分匹配的字符串。这将匹配CWMP后跟任意数量的非空白字符。模式开头\<的 会确保字符串CWMP出现在单词的最开头(即不作为其他位置的子字符串)。

使用

sed 's/^CWMP[^[:blank:]]*/&:/' file

如果您需要在行首强制匹配。


在某些情况下,您还可以使用

awk '$1 ~ /^CWMP/ { $1 = $1 ":"; print }' file

这假设您希望将行上的第一个空格分隔的单词与 匹配^CWMP,然后:在该单词的末尾添加 a 。然而,这会“吃掉”这些行上两个字段之间的所有空格,并将它们替换为单个空格:

$ awk '$1 ~ /^CWMP/ { $1 = $1 ":"; print }' file
CWMPVendorXEventCodeCutOff: 20

$1 ~如果您想在每行的开头进行匹配,即您的行不包含初始缩进,请删除。

答案2

sed -e 's/\(CWMPVendorXEventCodeCutOff\)/\1:/'

应该管用。

答案3

使用下面的 awk 命令进行测试,效果很好

命令

awk '{$1=$1":";printf  "%s%30s\n",$1,$2}' filename| sed -r "s/\s+/ /g"

输出

awk '{$1=$1":";printf  "%s%30s\n",$1,$2}' y.txt | sed -r "s/\s+/ /g"

CWMPVendorXEventCodeCutOff: 20
CWMP<othertitle>: 20

相关内容