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