Sedを使って空の行を削除しようとしています。
sed '/^$/d'
しかし、私は運が悪いです。
たとえば、次のような行があります。
xxxxxx
yyyyyy
zzzzzz
そして私はそれがのようになりたい:
xxxxxx
yyyyyy
zzzzzz
このためのコードは何ですか?
あなたの "空の"行にスペースやタブがあるかもしれません。空白だけを含むすべての行を削除するには、 POSIXクラス をsed
とともに使用します。
sed '/^[[:space:]]*$/d'
例えばgnu sedでEREを使う短いバージョン:
sed -r '/^\s*$/d'
(sedはNOTがPCREをサポートしていることに注意してください。)
awk
ソリューションが足りません。
awk 'NF' file
どちらが返されます:
xxxxxx
yyyyyy
zzzzzz
これはどのように作動しますか? NF
は "フィールド数"を表しているので、空の行は0項目を持ち、awkは0をFalseと評価し、行は表示されません。しかし、少なくとも1つのフィールドがある場合、評価はTrueとなり、awk
にデフォルトのアクションを実行させます。現在の行を表示します。
sed '/^$/d'
は問題ないはずです、あなたはその場でファイルを修正することを期待していますか?もしそうなら、あなたは-i
フラグを使うべきです。
txtfilesから空の行を削除し、行頭と行末からスペースを削除します 私はあなたが達成しようとしていることだと思います。
これが最も簡単で最速の方法だと思います。
cat file.txt | grep .
空白行もすべて無視する必要がある場合は、次の手順を試してください。
cat file.txt | grep '\S'
例:
s="\
\
a\
b\
\
Below is TAB:\
\
Below is space:\
\
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l
アウトプット
7
5
承認された回答 ここ および上記の承認された回答の助けを借りて、私は次のものを使用しました。
$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt
`s/^ *//` => left trim
`s/ *$//` => right trim
`/^$/d` => remove empty line
`/^\s*$/d` => delete lines which may contain white space
これはすべての基盤をカバーし、私の必要性のために完璧に機能します。元のポスター@Kentと@kevに賞賛
あなたは言うことができます:
sed -n '/ / p' filename #there is a space between '//'
テキストファイルはWindows上で作成されているため、予期しない動作が発生する可能性があります。したがって、行末シーケンスは\r\n
です。 sedまたはuseを実行する前にdos2unixを使用してUNIX形式のテキストファイルに変換できます。
sed -r "/^\r?$/d"
復帰があるかどうかにかかわらず、空白行を削除します。
"grep"を使って、そのようなことをすることもできます。
egrep -v "^$" file.txt
これはawkでも同様に機能します。
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
私のbash
特有の答えは、次のようにPerl
置換演算子をグローバルパターンg
flagと一緒に使用することを推奨することです。
$ Perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
この回答は、空の行にスペースがあるかどうか([\ ]*
)の説明、および|
を使用した複数の検索語/フィールドの区切りを示しています。 macOS High SierraとCentOS 6/7でテスト済み。
ちなみに、OPの元のコードsed '/^$/d' $file
は、高性能スーパーコンピューティングクラスタのmacOS High SierraおよびCentOS 6/7 Linux上のbash
ターミナルでうまく動作します。