使用 sed 或 awk 替换列之间的文本

使用 sed 或 awk 替换列之间的文本

我试图找到如何替换以下格式的文本:

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

相关内容