我试图用它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