私
午前
使用
基本
sed
式:-
sed -n "am/,/sed/p"
「am」と「sed」の間のテキストを取得して、「am\n using\n basic\nsed」を出力します。しかし、私の本当の問題は、文字列が次のようになるかどうかです:-
私
午前
使用
基本
grep
式。
この文で上記のsedを適用すると、「am\n using\n basic\n grep\nexpression」が表示されます。一致するものがない場合、出力を破棄するにはどうすればよいですか?
助言がありますか?
質問のコマンド(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"
次のようなわずかに異なるsedコマンドを使用する必要があります。
sed -n '/am/{:a; /am/x; $!N; /sed/!{$!ba;}; /sed/{s/\n/ /gp;}}' file
複数行にまたがるテキストam
およびsed
を含む行のみを印刷します。
SEDを使用する場合、これは機能しますが、非常に圧倒的な構文です... 複数行(\ n)テキストの一部を切り抜くが必要な場合は、-を使用してより簡単な方法を試してみてください。 grep:
cat multi_line.txt | grep -oP '(?s)(?<=START phrase).*(?=END phrase)'
たとえば、これを取得する最も簡単な方法だと思います変更リストの説明を強制します(残りのCL情報なし):
p4 describe {CL NUMBER} | grep -oP '(?s).*(?=Affected files)'
<=および> =を操作して、出力に開始/終了フレーズを含めることも含めないこともできます。