![Bashのすべての文字列で特定の部分文字列を置き換える方法は? [閉鎖]](https://linux33.com/image/157683/Bash%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AE%E9%83%A8%E5%88%86%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
次のように、ファイルの他の行には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"
これらのオプションはシェル変数を使用し、
keep
awk変数とそれぞれを定義します。target
new
k
t
n
k
とは正規表現t
として扱われます。+
または、同じ正規表現アクティブ文字が含まれている場合は、*
バックスラッシュでエスケープする必要があります。gsub(k, "\n")
これにより、すべての項目が改行文字に置き換えられます
k
。gsub(t, n)
これにより、ターゲット文字列のすべての項目が
t
新しい文字列に置き換えられますn
。gsub(/\n/, k)
これにより文字列が復元されます
k
。1
これはawkにラインを印刷するように指示します。