単語の終わりを別のものに置き換える

単語の終わりを別のものに置き換える

私はこれを持っています:

echo "walking ringer talking"

sedを使用して次の出力を取得するにはどうすればよいですか?

walked ringer talked

いくつかの方法を試しましたが、正しく動作しません。次のコマンドは私が試したものです。

echo "walking ringer talking" | sed 's/ing/ed/g'

この出力はwalked reder talked

echo "walking ringer talking" | sed 's/ing$/ed/g' 

この出力はwalking ringer talked

echo "walking ringer talking" | sed 's/^ing/ed/g;s/ing$/ed/g' 

この出力はwalking ringer talked

bashスクリプトでこれを実行しようとしています。

答え1

パターンの末尾のスペースまたは改行文字を一致させるには、次のようにします。

sed -E 's/ing( |$)/ed\1/g'

答え2

awkは文字列を3つの部分に分割し、必要な要素を置き換えます。これにより、print $0完全な(新しい)文字列が返されます。

echo $s | awk 'BEGIN{a[1]=a[3]}{for(x in a)gsub("ing","ed",$x); print $0 }'

答え3

「単語の終わり」タグを使用できます。

$ echo "walking ringer talking" | sed 's/ing\>/ed/g'
walked ringer talked

\>左の単語文字と右の単語以外の文字を一致させます。

または、あまり具体的ではない単語境界を使用すると、次のようになります。

$ echo "walking ringer talking" | sed 's/ing\b/ed/g'
walked ringer talked

\bすべての単語境界と一致しますが、単語文字の後に来る場合と同じです\>

答え4

's/ing /ed /g;3番目のテストではスペースを追加します。

#echo "walking ringer talking" | sed 's/^ing/ed/g;s/ing$/ed/g' 
echo "walking ringer talking" | sed 's/ing /ed /g;s/ing$/ed/g'

たとえば、

user@host:/tmp/test$ echo "walking ringer talking" | sed 's/ing /ed/g;s/ing$/ed/g' 
walked ringer talked

関連情報