次のファイルがあります。
Dir1/File1.cpp Dir2/File2.cpp \
Dir3/File1.h Dir4/File2.cpp \
Dir2/File1.cpp \
Dir2/File1.h \
次のようなファイルを生成したいと思います。
Dir1/File1.cpp
Dir2/File2.cpp
Dir3/File1.h
Dir4/File2.cpp
Dir2/File1.cpp
Dir2/File1.h
Bash/Sed/Awk/Grep などを使用して、この操作をどのように実行できますか?
ベストアンサー1
レコード区切り文字regexをサポートするAwkがある場合は、RS
次のことができます。
awk 'BEGIN { RS = " +| *\\\\?\\n" } 1'
これの利点は、ファイル全体をメモリに入れず、いくつかの正規表現置換を行わずに入力長がギガバイトになることです。
デフォルトでは、ファイルを 2 つのレコード区切り文字として扱います。 1つ以上のスペースまたはゼロ個以上のスペースと改行文字の前にオプションのバックスラッシュを付けることができます。
このようにレコードを分離した場合、私たちがしなければならないことは、レコードを出力し、その後にデフォルトの出力レコード区切り文字(ORS
)(もちろん改行文字)を付けることです。これは、以下で構成されるパターン作業規則によって達成されます1
。
sed
あるいは、配管を使用し、tr
POSIXに存在しないものを使用しないでください。
tr '\n' ' ' | sed -e 's/\\//g' -e 's/ \+/ /g' | tr ' ' '\n'
改行を空白に変更します。その後、バックスラッシュを削除しながら複数のスペースを1つに圧縮します。次に、スペースを改行文字にマップします。