回答:
最初に出現するパターンを特定の文字列に置き換えるには、次のコマンドを使用します。${parameter/pattern/string}
#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
echo "${firstString/Suzi/$secondString}"
# prints 'I love Sara and Marry'
すべての出現箇所を置き換えるには、次を使用します。${parameter//pattern/string}
message='The secret code is 12345'
echo "${message//[0-9]/X}"
# prints 'The secret code is XXXXX'
(これは、に記載されてバッシュリファレンスマニュアル、§3.5.3「シェルパラメータ展開」。)
この機能はPOSIXでは指定されていないことに注意してください。これはBash拡張機能であるため、すべてのUnixシェルがこの機能を実装しているわけではありません。関連するPOSIXドキュメントについては、The Open Group Technical Standard Base Specifications、Issue 7、Shell&Utilitiesボリューム、§2.6.2 "Parameter Expansion"を参照してください。
\n
そのコンテキストでは、改行ではなく、それ自体を表すためです。現在、Bashをテストするのに便利ではありませんが、のようなものを書くことができるはず$STRING="${STRING/$'\n'/<br />}"
です。(たぶんあなたは望むSTRING//
-代わりに全部を置き換える- STRING/
)
echo ${my string foo/foo/bar}
。必要なものinput="my string foo"; echo ${input/foo/bar}
//
直接言及するのではなく、「パターンが ' /
'で始まる場合」に言及します(これは正確ではありません。その文の残りの/
部分では、エクストラは実際にはパターン)-しかし、私はもっと良い情報源を知りません。
これは、bash文字列操作で完全に実行できます。
first="I love Suzy and Mary"
second="Sara"
first=${first/Suzy/$second}
これにより、最初の出現のみが置き換えられます。それらをすべて置き換えるには、最初のスラッシュを2倍にします。
first="Suzy, Suzy, Suzy"
second="Sara"
first=${first//Suzy/$second}
# first is now "Sara, Sara, Sara"
Dashの場合、以前の投稿はすべて機能しません
POSIX sh
互換ソリューションは次のとおりです。
result=$(echo "$firstString" | sed "s/Suzi/$secondString/")
result=$(echo $firstString | sed "s/Suzi/$secondString/g")
echo
引数の周りに欠落している引用符も追加しました。それは単純な文字列で引用することなく一見機能しますが、重要な入力文字列(不規則な間隔、シェルのメタ文字など)で簡単に壊れます。
これを試して:
sed "s/Suzi/$secondString/g" <<<"$firstString"
sed
文字列にRegExp文字が含まれている場合よりもbashを使用する方が適切です。
echo ${first_string/Suzi/$second_string}
Windowsに移植可能で、少なくともBash 3.1と同じくらい古いバージョンで動作します。
エスケープについてあまり心配する必要がないことを示すために、これを有効にしましょう:
/home/name/foo/bar
これに:
~/foo/bar
しかし/home/name
、最初にある場合にのみ。必要ありませんsed
!
bashが魔法の変数$PWD
and を与えるとすると$HOME
、次のことができます。
echo "${PWD/#$HOME/\~}"
編集:引用/エスケープに関するメモのコメントでMark Haferkampに感謝し~
ます。*
変数$HOME
にスラッシュがどのように含まれているのかに注意してください。
参考資料:Advanced Bash-Scripting Guide。
を使用sed
する必要がある場合は、必ずすべての文字をエスケープしてください。
sed
、pwd
コマンドを使用できなくなりました$PS1
。Bashは、マジック変数よりも一般的な方法で、コマンドの出力を文字列置換に使用できますか?あなたのコードについては、~
Bashがそれを$ HOMEに展開しないように、をエスケープする必要がありました。また、#
コマンドのは何をしますか?
~
」について:どのように引用したかに注意してください。常に引用することを忘れないでください!そして、これは魔法の変数だけでは機能しません。どの変数も、bash内で置換、文字列長の取得などが可能です。高速化を試みて、おめでとうございます。別のプログラミング言語に慣れていて、コンパイルされたプロンプトをコーディングしたい$PS1
場合にも興味があるかもしれ$PROMPT_COMMAND
ません。
echo "${PWD/#$HOME/~}"
私に代わるものではありません$HOME
で~
。交換~
し\~
たり'~'
作品。これらはいずれも、別のディストリビューションのBash 4.2.53で動作します。~
互換性を高めるために、を引用またはエスケープするように投稿を更新できますか?「マジック変数」の質問で私が意味したuname
ことは、最初に変数として保存せずに、出力などでBashの変数置換を使用できるかどうかです。私の個人的なことは$PROMPT_COMMAND
、複雑です。
純粋なPOSIXシェルメソッド。これは、Roman Kazanovskyiのsed
ベースの回答とは異なり、外部ツールを必要とせず、シェル自体のネイティブパラメーター拡張のみが必要です。コードが1行に収まるように、長いファイル名は最小化されていることに注意してください。
f="I love Suzi and Marry"
s=Sara
t=Suzi
[ "${f%$t*}" != "$f" ] && f="${f%$t*}$s${f#*$t}"
echo "$f"
出力:
I love Sara and Marry
使い方:
最小のサフィックスパターンを削除します。 "${f%$t*}"
リターン「I love
」サフィックスがあれば$t
「Suzi*
」です$f
「」。 I love
Suzi and Marry
しかしの場合t=Zelda
、"${f%$t*}"
何も削除せず、文字列「I love Suzi and Marry
」全体を返します。
これがあれば、テストに使用され$t
ている$f
と[ "${f%$t*}" != "$f" ]
まで評価される真の場合$f
、文字列が含まれています「Suzi*
」と虚偽の場合ではありません。
テストが戻る場合は真、使用して目的の文字列を構築削除最小のサフィックス・パターンを ${f%$t*}
「I love
」と最小プレフィックスパターンを削除する ${f#*$t}
「and Marry
と、」第二の文字列$s
「Sara
の間で」。
私はこれが古いことを知っていますが、awkの使用について誰も言及していないので:
firstString="I love Suzi and Marry"
echo $firstString | awk '{gsub("Suzi","Sara"); print}'
echo [string] | sed "s/[original]/[target]/g"