Bashのすべての文字列で特定の部分文字列を置き換える方法は? [閉鎖]

Bashのすべての文字列で特定の部分文字列を置き換える方法は? [閉鎖]

次のように、ファイルの他の行には2つの文字列/パスがあります。

    cmd a/b/c -x -y


    cmd a/b/c -x 

これら2つの文字列のうち、2番目の文字列のみを置き換えたいと思います。 2番目の文字列を置き換えましたが、sedコマンドのバグのために両方の文字列を置き換えています。sedこれを行うには、bashの使い方や他のコマンドを教えてください。

ベストアンサー1

sedには、他の正規表現エンジンでサポートされているクールなプレビュー機能はありませんが、まだ必要に応じて実行できます。努力する:

sed 's@cmd a/b/c -x -y@\n@g; s@cmd a/b/c -x@New String@g; s@\n@cmd a/b/c -x -y@'

はい

$ cat file
(1). cmd a/b/c -x -y (2). cmd a/b/c -x
$ sed 's@cmd a/b/c -x -y@\n@g; s@cmd a/b/c -x@New String@g; s@\n@cmd a/b/c -x -y@' file
(1). cmd a/b/c -x -y (2). New String

どのように動作しますか?

  • s@cmd a/b/c -x -y@\n@g

    これにより、不要な文字列が改行文字に置き換えられます。

  • s@cmd a/b/c -x@New String@g

    これにより、必要な交換が行われます。

  • s@\n@cmd a/b/c -x -y@

    これにより、目的の文字列が変更されずに復元されます。

変数の使用

sedでは変数を使用できますが、エラー、予期しない結果、セキュリティ違反などの問題がいっぱいです。 awkは、変数を簡単かつ安全に処理するためにはるかに良い作業を行います。

まず、シェル変数を作成してみましょう。

keep='cmd a/b/c -x -y'
target='cmd a/b/c -x'
new='New String'

それでは、awkコマンドを実行してみましょう。

$ awk -v k="$keep" -v t="$target" -v n="$new" '{gsub(k, "\n"); gsub(t, n); gsub(/\n/, k)} 1' file
(1). cmd a/b/c -x -y (2). New String

awk コマンドのロジックは sed のロジックとまったく同じです。

仕組み:

  • -v k="$keep" -v t="$target" -v n="$new"

    これらのオプションはシェル変数を使用し、keepawk変数とそれぞれを定義します。targetnewktn

    kとは正規表現tとして扱われます。+または、同じ正規表現アクティブ文字が含まれている場合は、*バックスラッシュでエスケープする必要があります。

  • gsub(k, "\n")

    これにより、すべての項目が改行文字に置き換えられますk

  • gsub(t, n)

    これにより、ターゲット文字列のすべての項目がt新しい文字列に置き換えられますn

  • gsub(/\n/, k)

    これにより文字列が復元されますk

  • 1

    これはawkにラインを印刷するように指示します。

おすすめ記事