2つの異なるパターン間で事前に選択されたテキストのパターンで始まる行を選択します

2つの異なるパターン間で事前に選択されたテキストのパターンで始まる行を選択します

2つの異なるパターン(PAT1とPAT2)の間のあらかじめ選択されたテキストから、パターン(xの後に数字)で始まる選択された行を印刷する2つのステップで必要な操作を実行するUNIXスクリプトがあります。

1)PAT1とPAT2を含む行を除いて、2つのモード(PAT1とPAT2)の間で事前に選択されたテキスト -この記事に基づいて

sed -n '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}'  file.txt > newfile.txt

2)あらかじめ選択されたテキストのパターン(xの後に数字)で始まり、選択した行を印刷します。

sed -n '/^x [[:digit:]]*/p'  newfile.txt > newfile2.txt

1つのステップで同じ結果を得る方法はありますか?

このスクリプトを試しましたが機能しません(コードがブロックされ続けます)。

sed -e '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' ; '/^x [[:digit:]]*/p'  file.txt > newfile.txt

私はLinuxではなくOSXで作業しています。

ベストアンサー1

最初の作業を少し調整するだけですsed

sed -n '/PAT1/,/PAT2/{/^x [[:digit:]]*/p;}' file.txt > newfile.txt
  • 次の行に表示PAT1されない限り、&を除外しようとする必要はありません。PAT2^x [0-9]
sed -n '/PAT1/,/PAT2/{/PAT1\|PAT2/!{/^x [0-9]*/p;};}' file.txt

PAT1&も除外されます。PAT2


以下は何もしないようです。

sed -e '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' ; '/^x [[:digit:]]*/p'
                                            ^

最初のコマンド(sed)はファイルから何も入力されていないので、standard inputキーボードの入力を待っているということです。

セミコロンは引用符で囲まれません。これは、ユーザーが提供するコマンドを解釈するために使用されるシェル構文の一部を構成します。簡単に言えば、上記の行の意味は次のとおりです。execute a command named 'sed', then execute a command named '/^x [[:digit:]]*/p'- 言わないでください。

おすすめ記事