web-dev-qa-db-ja.com

UNIXの2つの単語の間にテキストを抽出する方法は?


午前
使用
基本
sed
式:-

sed -n "am/,/sed/p" 

「am」と「sed」の間のテキストを取得して、「am\n using\n basic\nsed」を出力します。しかし、私の本当の問題は、文字列が次のようになるかどうかです:-


午前
使用
基本
grep
式。

この文で上記のsedを適用すると、「am\n using\n basic\n grep\nexpression」が表示されます。一致するものがない場合、出力を破棄するにはどうすればよいですか?

助言がありますか?

14
crazy_prog

質問のコマンド(sed -n "/am/,/sed/p"、追加されたスラッシュに注意してください)は次のことを意味します:

  • 文字列amを含むlineを見つけます
  • pを含む行が発生するまで(sed)を出力します

したがって、次のように出力されます。

I am using basic grep expression

amが含まれているためです。さらに行を追加すると、sedを含む行が発生するまでそれらも出力されます。

例えば。:

echo -e 'I am using basic grep expression.\nOne more line\nOne with sed\nOne without' | sed -n "/am/,/sed/p"

結果:

I am using basic grep expression.
One more line
One with sed

私は思う-あなたがしたいことはそのようなものです:

sed -n "s/.*\(am.*sed\).*/\1/p"

例:

echo 'I am using basic grep expression.' | sed -n "s/.*\(am.*sed\).*/\1/p"

echo 'I am using basic sed expression.' | sed -n "s/.*\(am.*sed\).*/\1/p"
sed -n "s/.*\(am.*sed\).*/\1/p"
13
bmk

次のようなわずかに異なるsedコマンドを使用する必要があります。

sed -n '/am/{:a; /am/x; $!N; /sed/!{$!ba;}; /sed/{s/\n/ /gp;}}' file

複数行にまたがるテキストamおよびsedを含む行のみを印刷します。

3
anubhava

SEDを使用する場合、これは機能しますが、非常に圧倒的な構文です... 複数行(\ n)テキストの一部を切り抜くが必要な場合は、-を使用してより簡単な方法を試してみてください。 grep

cat multi_line.txt | grep -oP '(?s)(?<=START phrase).*(?=END phrase)'

たとえば、これを取得する最も簡単な方法だと思います変更リストの説明を強制します(残りのCL情報なし):

p4 describe {CL NUMBER} | grep -oP '(?s).*(?=Affected files)'

<=および> =を操作して、出力に開始/終了フレーズを含めることも含めないこともできます。

1
Noam Manos