Bash - 文字列から文字を抽出する

Bash - 文字列から文字を抽出する

次のような変数があるとしましょう。

$string = 'cat somecommandhere'

これで、上記のコマンドの出力は次catのようになります。

test="Thanks serverfault"

引用符間の値を抽出し、引用$string符を含む同じ変数に保存したいと思います。文字列に次の値を含めたいと思います。

$string = "Thanks serverfault"  

sedgrepまたは代わりにこれを行うにはどうすればよいですか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"

関連情報