私は次の補完/「反対」をしたいです
sed 13q;d <file.txt
より一般的には、これらの報酬/逆/反対演算を実行することは可能ですか
sed
?それとも正規表現に固有のものですか?最後の行から3行目を除くすべての内容を印刷するにはどうすればよいですか?これには2ビットが必要
tac
で、今後計算する必要がありますかsed
?それともsed
後ろから計算する方法がありますか?
答え1
パート1
13行目を削除してくださいd
:
sed '13d' <file.txt
上記を補完する一般的なアプローチは次のとおりです。
sed '13!d' <file.txt
パート2
なぜなら、次のことが可能だからです。
sed -n ':a;${P;q};N;4,$D;ba' <file.txt
この4
数字は必要以上に1つ多いです。したがって、最後の10行が必要な場合は、これは11
。
テスト用seq
:
$ seq 100 | sed -n ':a;${P;q};N;4,$D;ba'
98
$
説明しよう
:a # define label a
${ # match the last line
P # print the first line of the pattern space
q # quit
}
N # match all lines: append the next line to the pattern
4,${ # match the range of lines 4 to the end of the file
D # delete the first line of the pattern space
}
ba # match all lines: jump back to label a
Glen Jackmanの貴重な追加:
それは「N行目のみ」です。これは「N行を除くすべての行」です。
sed -n ':a;${s/^[^\n]*\n//;p;q};N;4,${P;D};ba'
GNU sedでは機能しますが、この\n
シーケンスは他のsedでは機能しない可能性があります。
BSD sed(OSX)で試しましたが、上記の形式では正しく機能しないことがわかりました。問題は次のとおりです。
;
線の分離は通常は機能しますが、ラベルの後には機能しないようです。;
BSD sedは1行のコマンドグループ{}
の最後のコマンドの後に必要なようですが、GNU sedはそうではありません。\n
これは通常正規表現では機能しますが、角かっこ式[]
では機能しません。したがって、改行文字を除外するには、次のようなものを使用できます[[:alnum:][:punct:][:graph:][:blank:]]
。ただし、これは他の文字(特に異なる制御文字)を除外できます。
したがって、以下はよりプラットフォームに依存しないバージョンを試しました。
sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'
これはOSXとUbuntuで動作するようです。