如何匹配行中的模式并将其插入到另一个模式之后

如何匹配行中的模式并将其插入到另一个模式之后

我有一个包含 2 行的文件

1, output /test here    
2, output /test here

我想把它改成这样:

1, output /test 1 here    
2, output /test 2 here

以便将 之前的字符串,复制到该/test字符串后面。

我怎样才能用awkor做到这一点sed

答案1

您可以使用捕获组和反向引用前任。

sed 's:\([^,]*\), output /test:& \1:' file

由于您还标记了您的问题awk,因此您也可以执行类似的操作

awk -F, 'match($0,/\/test/) {print substr($0,1,RSTART+RLENGTH) $1, substr($0,RSTART+RLENGTH+1)}' file

答案2

这个问题实际上只讨论“行上第一个逗号之前的字符串”和“字符串/test”,之后应该复制与第一个模式匹配的字符串(带有分隔空格)。

sed 's/^\([^,]*\),.*\/test/& \1/' file

这会将与整个表达式匹配的子字符串替换为其自身,后跟一个空格以及第一个逗号之前匹配的子字符串。它没有对该行的内容做进一步的假设。

给出问题中的数据的输出:

1, output /test 1 here
2, output /test 2 here

您是否想/test用行开头的子字符串替换文本(这是暗示的)在评论中):

sed 's/^\(\([^,]*\),.*\)\/test/\1\2/' file

这将替换行中与第一个sed命令相同的位,但不是仅从行的开头附加该位,而是不包括/test末尾的字符串。替换重用了前面的空格字符/test,因此不需要插入新的空格。

具有相同输入数据的输出:

1, output 1 here
2, output 2 here

答案3

sed -E 's/([0-9]*),\s([a-z].*\s.[a-z]*)\s([a-z].*)/\1 \2 \1 \3/'

sed解决方案只是对匹配进行分组,以便在替换时保留原始值可以重新排列它们。

awk -F"[, ]" '{sub($4, $4" "$1)}1'

上述awk解决方案将用第 4 列的原始值替换第 4 列的值/test,并将第 1 列的值附加到其上。

答案4

awk解决方案可以帮助:

awk '/\/test/ {$3=$3 " " $1;sub(/,$/,"",$3)} 1' file
1, output /test 1 here
2, output /test 2 here

相关内容