我有一个包含 2 行的文件
1, output /test here
2, output /test here
我想把它改成这样:
1, output /test 1 here
2, output /test 2 here
以便将 之前的字符串,
复制到该/test
字符串后面。
我怎样才能用awk
or做到这一点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