sedを正しく使用して ""文字以外のテキストを削除するには?

sedを正しく使用して ""文字以外のテキストを削除するには?

aaaaaa"bbbbb"aaaa出力したいテキストがあります。bbbbb

私はこれを試しましたが、文字だけを切り捨てsed -e 's/"\(.*\)"/\1/'ます。"これを正しくフィルタリングするにはどうすればよいですか?

答え1

簡単に作業してくださいcut

テキストが標準入力から来る場合:

echo 'aaaaaa"bbbbb"aaaa' | cut -d\" -f2

テキストが次の名前のファイルにある場合filename

cut -d\" -f2 filename

コマンドの説明cut:

  • -d\"cut区切り文字が"\isはエスケープに使用されます。そうでない場合は、シェルが閉じていない引用符について文句を言います)と教えてください。
  • -f2cut2番目のフィールドを取得するように指示します("上記で区切られています)。

答え2

sedただコマンドの「右」にある内容を出力するだけではありませんs。これは、左の一致を右の項目に置き換え、結果行(またはより技術的にはパターン空間)を出力します。

echo 'aa"bb"aa'|sed 's/"\(.*\)"/\1/'

正規表現の左側はと一致します"bb"。これは、キャプチャグループでキャプチャしたアイテムに置き換えられますbb。したがって、出力はaabbaa

上記の内容は次のとおりです。

echo 'aa"bb"aa'|sed 's/.*"\(.*\)".*/\1/'

この正規表現は行全体と一致するため、にaa"bb"aa置き換えられます。bbこれが出力です。

別の可能なツールは次のとおりですawk

echo 'aa"bb"aa'|awk -F '"' '{print $2}'

これは"区切り文字として使用され、2番目のフィールドを印刷します。

答え3

ソリューションが必要な場合は、sed次のようなソリューションがありますtr

echo 'aaaaaa"bbbbb"aaaa' | tr '"' '\n' | sed -n 2p

または以下を使用してくださいawk

echo 'aaaaaa"bbbbb"aaaa' | awk -F'"' '{print $2}'

(私はまだを好むcut。参照してください。@GMasterからの返信)。

答え4

grep回避策(プレビューを使用するためPCREオプション):

grep -oP '(?<=")[^"]*(?=")'

関連情報