web-dev-qa-db-ja.com

sedとの一致の前にすべての行を削除します

私はsedを使用してファイルのリストをフィルタリングしています。フォルダーのリストを並べ替えてあり、特定の行の後のすべての行を取得したい。このタスクを実行するには、説明したソリューションを使用しています here これは、試した入力でかなりうまく機能しますが、最初の行に一致する場合は機能しません。その場合、sedは入力のすべての行を削除します

ここに例があります:

(ssh) fabio@s2 : ~
[0] % ls -1 /
bin
boot
...
sys
tmp
usr
var
vmlinuz

(ssh) fabio@s2 : ~
[0] % ls -1 / | sed '1,/tmp/d'
usr
var
vmlinuz

(ssh) fabio@s2 : ~
[0] % ls -1 / | sed '1,/^bin$/d'
# sed will delete all lines from the input stream

最初の行が正規表現で一致する場合の制限ケースも考慮するようにコマンドを変更するにはどうすればよいですか?

ところでsed '1,1d'は正しく機能し、最初の行のみを削除します。

21
Fabio

これを試してください(GNU sedのみ):

sed '0,/^bin$/d'

..出力は:

 $ sed '0、/ ^ bin $/d'ファイル
 boot 
 ... 
 sys 
 tmp 
 usr 
 var 
 vmlinuz 
25
Endoro

次のsedコマンドは、一致する行以降のすべての行を出力します。

sed -n '/^WHATEVER$/,$p'

-nスイッチは、指示された場合にのみsedを印刷します(pコマンド)。

一致する行を含めたくない場合は、ファイルの先頭から一致する行までを削除するようにsedに指示できます。

sed '1,/^WHATEVER$/d'

(行を削除するdコマンドを使用します。)

27
adamse

あなたも試すことができます:

awk '/searchname/{p=1;next}{if(p){print}}'
7
Vijay

一致の前にタグを挿入し、スコープ/start/,/####tag####/で削除します。

0
rishta