次のような変数があるとしましょう。
$string = 'cat somecommandhere'
これで、上記のコマンドの出力は次cat
のようになります。
test="Thanks serverfault"
引用符間の値を抽出し、引用$string
符を含む同じ変数に保存したいと思います。文字列に次の値を含めたいと思います。
$string = "Thanks serverfault"
sed
grep
または代わりにこれを行うにはどうすればよいですかawk
?まだ学んでいませんawk
。
答え1
これが「2番目の部分」を意味し、二重引用符を切り捨てることを意味するとcut
推論しやすいので使用します。-f2
-d'"'
$ output='test="Thanks serverfault"'
$ string=$( echo $output | cut -f2 -d'"' )
$ echo $string
Thanks serverfault
本当に引用をしたい場合は、自分で再度追加すると、答えが必要以上に混乱しているように見えます。
本当に使いたい場合sed
(幸いにも引用符も保存されます):
$ output='test="Thanks serverfault"'
$ string=$( echo $output | sed 's/^test=//' )
$ echo $string
"Thanks serverfault"
説明sed
:
s/^test=//
string find/replace mode ^ | ^ replace with nothing
starts with test=
答え2
sedは必要ありません。 bashとshには組み込み変数修飾子があります。
$ output='test="Thanks serverfault"'
$ string=\"${output#*\"}
$ string=${string%\"*}\"
$ echo $string
"Thanks serverfault"
#プレフィックスを削除します。 % はサフィックスです。
これは外部プログラムを呼び出すよりも高速です。
答え3
おそらく他のユーザーが最高の答えをしたでしょう。 sedは必要ありません。しかし、必要に応じて次のように動作します。
sed 's/.*=//' #this will remove everything before (inclusive) of the equal.
答え4
pcregrepを使用して下さい:
string=$(eval " $string" | pcregrep -Mo '(?s)"(\\.|[^"])*"')
シェルコードへの内容を評価し、$string
出力から二重引用符で囲まれた文字列を抽出し、エスケープされた"
sとsを処理\
し、に改行で区切って保存します$string
。
たとえば、次のようなものがfile=some-file string='cat < "$file"'
ありますsome-file
。
test="Thanks serverfault"
test2="with \"quotes\" and backslash\\" test3="multi
line"
$string
最終的には以下が含まれます。
"Thanks severfault"
"with \"quotes\" and backslash\\"
"multi
line"