次のサンプルテキストを含むファイルがあります。
THIS(
is first
Line);
THAT(
is second line);
THIS(
is third
line);
THAT(
is
fourth
line);
ファイルを見ると、各セクションは「THIS」または「THAT」で始まり、各テキストセクションはセミコロン()で終わります;
。私は「THIS」と「THAT」を検索し、すべての「THIS」部分を1つのファイルにコピーし、すべてのfirst_file
「THAT」部分を別のファイルにコピーするUnixコマンド/スクリプトが必要ですsecond_file
。
例: 最初のファイルには以下を含める必要があります。
THIS(
is first
Line);
THIS(
is third
line);
2番目のファイルには、次のものを含める必要があります。
THAT(
is second line);
THAT(
is
fourth
line);
答え1
与えられた
$ cat thisthat
THIS(
is first
Line);
THAT(
is second line);
THIS(
is third
line);
THAT(
is
fourth
line);
それから
awk -vRS=';\n' 'BEGIN{ORS=RS} /^THIS/ {print > "these"} /^THAT/ {print > "those"}' thisthat
結果
$ head these those
==> these <==
THIS(
is first
Line);
THIS(
is third
line);
==> those <==
THAT(
is second line);
THAT(
is
fourth
line);
答え2
いくつかの奇妙な場合:
$ awk -v RS=';' 'NF{sub(/^\n/,""); print > (/^THIS/ ? "first_file" : "second_file")}' file
$ cat first_file
THIS(
is first
Line)
THIS(
is third
line)
$ cat second_file
THAT(
is second line)
THAT(
is
fourth
line)
あるいは、GNU awkを使用してマルチキャラクタRSとRTを実装します。
$ awk -v RS='(THIS|THAT)[^;]+;\n' -v ORS= '{$0=RT; print > (/^THIS/ ? "first_file" : "second_file")}' file
$ cat first_file
THIS(
is first
Line);
THIS(
is third
line);
$ cat second_file
THAT(
is second line);
THAT(
is
fourth
line);
どちらのソリューションも、例が正確で;
ブロックの終わり(部品の内部ではない)を除いて(...)
sがないと仮定します。
答え3
ed
ファイルエディタを使用しますが、最初に2番目の(空の)ファイルを作成します。file1
この例では、ソースファイルの名前が指定されています。
という名前の2番目のファイルを作成します。file2
> file2
整理
ed -s file1 << 'EOF'
H
g/^THAT($/;/^.*\;$/d
w
u
g/^THIS($/;/^.*\;$/d
0r file2
w file2
EOF
file1
heredocが提供する最初の行を使用してください。ed
ed -s file1 << 'EOF'
2行目は、エラーに役立つ詳細なメッセージを表示します。H
3行目はTHAT(で始まる行を;で終わる行まで削除します)。
g/^THAT($/;/^.*\;$/d
4行目は変更をfile1に書き込みます。w
5行目は、file1以外のバッファへの変更のみをキャンセルします。u
6行目はTHIS(で始まる行を;で終わる行まで削除します)。
g/^THIS($/;/^.*\;$/d
行7では、バッファに残っているテキストをfile2の先頭に追加します。
0r file2
ファイル2を変更するために8行が記録されます。w file2
唯一のライナー。
>file2; printf '%s\n' H 'g/^THAT($/;/^.*\;$/d' w u 'g/^THIS($/;/^.*\;$/d' '0r file2' 'w file2' | ed -s file1
ed
ファイルを編集することは、in-place
ファイルが直接編集され、出力が他の場所に印刷されないことを意味するため、本番ファイルed
で実行する前に、まずいくつかの例を使用してテストします。
答え4
Awkフラグ方式を試してください
awk '/THIS/{f=1}/THAT/{f=0}f' file > file1(Contains "THIS" PATTERN)
awk '/THAT/{f=1}/THIS/{f=0}f' file > file2(Contains "THAT" PATTERN)
出力
cat file1
THIS(
is first
Line);
THIS(
is third
line);
cat file2
THAT(
is second line);
THAT(
is
fourth
line);