我试图找到如何替换以下格式的文本:
input1:input2:input3
aaa:bbb:ccc
111:222:333
我希望结果看起来像:
input1:new-text:input3
aaa:new-text:ccc
111:new-text:333
可以通过 sed、awk、cut 或其他任何方式来完成,只要结果良好即可。
答案1
考虑到规则“将由冒号分隔的第二个字段替换为new-text
”,awk 使这变得相当简单:
awk -F':' 'BEGIN { OFS=FS } {$2="new-text"; print} ' < input > output
告诉-F':'
awk 使用冒号来分隔每行中的字段。
该BEGIN
节设置了输出将字段分隔符更改为当前字段分隔符(冒号),以便稍后重新打印该行时,awk 再次使用冒号将字段连接在一起。
第二部分前面没有条件,因此每行都会执行;它实际工作是将第二个字段替换为new-text
,然后打印新行。
答案2
如果您确实需要完全相同的文本来替换文件每一行上唯一的一对“:”之间的中间块,那么这可以工作
sed -i -- "s|:.*:|:${mynewtext}:|" $inputfile
模式 .* 仅表示一个或多个字符
答案3
假设您的文本位于名为code
]$cat code
input1:input2:input3
aaa:bbb:ccc
111:222:333
运行这个命令
]$sed -e 's/:[^:]*:/:new-text:/' code
input1:new-text:input3
aaa:new-text:ccc
111:new-text:333
答案4
要以通用和 POSIX sed 方式查看它,其中可以在执行代码时提供要删除的列sed
,以及要替换的列的新内容,您可以这样做:
n=2; # the column number to be modified with a new value
repl="new-text"; # the text used to replace the contents of the n-th col
# to make the replacement sed friendly, otw, if it happened to have chars
# which have a meaning to sed when using on the rhs of s/// command, we will
# have an error on our hands.
repl_esc=$(printf '%s\n' "$repl" | sed -e 's|[\&/]|\\&|g;$!s/$/\\/')
sed -e '
s/.*/:&:/
'"s/:/\\n/$n;s//\\
/$n;
s/\\n.*\\n/:${repl_esc}:/"'
s/^://
s/:$//
' input-file.txt