一致する行を除いて、一致する2つの文字列の間の行を抽出します。

一致する行を除いて、一致する2つの文字列の間の行を抽出します。

以下は私のファイルです

$ cat README
login user1
run .profile
cd /u/opt
unzip -l zip file
copy files in zip file to .orig
unzip -o the zip file
cd /u/opt/install
./reqe21.sh
sqlplus admin/<password> @req.sql
logout

最後に、一致する文字列の間に行が必要ですunzip。つまり、logout希望の出力は次のようになります。

cd /u/opt/install
./reqe21.sh
sqlplus admin/<password> @req.sql

答えが必要です。

  1. 試してみると、sed -n '/unzip -o /,/logout/p' README一致する行は除外されません。

したがって、次のような結果が得られます。

unzip -o the zip file
cd /u/opt/install
./reqe21.sh
sqlplus admin/<password> @req.sql
logout

ここで提供されている他のソリューションを試しました。sedから範囲パターンに一致する行を除外する方法は?

しかし、望む結果は出ません。以下を参照してください。

$ sed '1,/unzip/d;/logout/,$d' README
copy files in zip file to .orig
unzip -o the zip file
cd /u/opt/install
./reqe21.sh
sqlplus vrcadmin/<password> @req.sql
  1. sed最後と最後unzipの間の行logout、つまり以前に共有された希望の出力を取得するためにどのように使用できますか?

ベストアンサー1

これは単にsedが最も適切な仕事ではありません。この試み:

$ tac file | awk '/unzip/{exit} f; /logout/{f=1}' | tac
cd /u/opt/install
./reqe21.sh
sqlplus admin/<password> @req.sql

または何らかの理由で1つのツールのみを使用したい場合:

$ awk '/logout/{f=0} f{rec=rec $0 ORS} /unzip/{rec=""; f=1} END{printf "%s", rec}' file
cd /u/opt/install
./reqe21.sh
sqlplus admin/<password> @req.sql

おすすめ記事