sedを使用して複数の文字を置き換える方法は?

sedを使用して複数の文字を置き換える方法は?

このスクリプトがあります。

replace 3

echo 12345 | sed "s/^\(.\){"$1"}/\1hi/"

私もこれを試しました:

echo 12345 | sed "s/^\(.{"$1"}\)/\1hi/"

この場合、スクリプトで「12345」(123hi45)の最初の3文字の後に「hi」を追加したいと思います。これはスクリプトなので、「3」はパラメータであり、変更される可能性があります。私は本当にここに閉じ込められています。よろしくお願いします!

ベストアンサー1

中かっこを離れると、コマンドは機能します($1未知の理由で引用符なしで引用しています)。

$ set -- 3
$ echo 12345 | sed "s/^\(.\{$1\}\)/\1hi/"
123hi45

反復{n}修飾子は拡大する正規表現修飾子、ここで基本的な正規表現は次のように書かれます\{n\}sedユーティリティはデフォルトでデフォルトの正規表現を使用します。

いくつかの文字を次のように書き直して保存できます。

echo 12345 | sed "s/^.\{$1\}/&hi/"

個人的には別のアプローチをとります。


hi3番目の文字の後に文字列を追加しようとしています12345。ここで、「3番目」はの値で指定されます$1

echo 12345 | sed 's/./&hi/'"$1"

この場合、式は次のようになります$13sed

s/./&hi/3

これは、3番目の一致(すべての文字)を.同じ文字(&代替項目に含まれる内容)に置き換えますhi

このようにコマンドの末尾に数字を配置すると、そのパターンの :n番目の発生が置き換えられます。ssedsedn

テストの実行(読みやすくするために入力が変更され置き換えられます):

$ set -- 3
$ echo abcde | sed 's/./&<hi>/'"$1"
abc<hi>de
$ set -- 4
$ echo abcde | sed 's/./&<hi>/'"$1"
abcd<hi>e
$ set -- 1
$ echo abcde | sed 's/./&<hi>/'"$1"
a<hi>bcde

おすすめ記事