xyz
1行に対応する文字列があり、それに続くすべての行を新しいファイルにコピーfile1.txt
したいと思います。この目標をどのように達成できますか?xyz
file1.txt
file2.txt
私はcat
コマンドを知っています。ところで、出発船をどのように指定しますか?
答え1
GNU sedの使用
すべての行をコピー後ろに xyz
、努力する:
sed '0,/xyz/d' file1.txt >file2.txt
1,/xyz/
最初の行で始まり、最初の一致で終わる行の範囲を指定しますxyz
。 d
sedにこの行を削除するように指示してください。
メモ:BSD / MacOSでは、sedは機能しますsed '1,/xyz/d' file1.txt >file2.txt
が、最初の項目がxyz
2行目以上にある場合にのみ機能します。 (帽子のヒント:先行.)
提案された別のアプローチドンクリスティ、次に適用する必要があります。みんなsed:
{ printf %s\\n; cat file1.txt; } | sed '1,/xyz/d' >file2.txt
はい
次のテストファイルを検討してください。
$ cat file1.txt
a
b
xyz
c
d
次のコマンドを実行してください。
$ sed '1,/xyz/d' file1.txt >file2.txt
$ cat file2.txt
c
d
awkを使う
awkにも同じロジックを使用できます。
awk 'NR==1,/xyz/{next} 1' file1.txt >file2.txt
NR==1,/xyz/{next}
awkに、最初の(NR==1
)から正規表現に一致する最初の行まで、すべての行をスキップするように指示しますxyz
。 1
残りのすべての行を印刷するように awk に指示します。
答え2
そしてed
:
ed -s file.txt <<< $'/xyz/+1,$w file2.txt'
ed
これは、有線から次に(リモート)コマンドを送信します。後ろに()には+1
ファイル()の終わりまでの行が記録されています。xyz
$
w
file2.txt
答え3
そしてcsplit:
csplit -s file1.txt %xyz%1
答え4
$ sed -n '/xyz/,$p' file.txt > file2.txt
すべての行が印刷されるのを-n
防ぎます。sed
with は$
ファイルの終わりを示し、end はp
印刷行を示します。つまり/xyz/$p
、行が一致するとxyz
ファイルの最後まで印刷します。