連続したパターンを一致させて他のパターンの後に挿入する方法

連続したパターンを一致させて他のパターンの後に挿入する方法

2行のファイルがあります。

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

私はこれを次のように変更したいと思います:

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

前の文字列を,この文字列の末尾にコピーします/test

awkまたはを使用してこれをどのように実行できますか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

関連情報