私はsedを使用して空の行を削除しようとしています:
sed '/^$/d'
しかし、私はそれで運がありません。
たとえば、次の行があります。
xxxxxx
yyyyyy
zzzzzz
そして私はそれが次のようになりたいです:
xxxxxx
yyyyyy
zzzzzz
このためのコードは何ですか?
私はsedを使用して空の行を削除しようとしています:
sed '/^$/d'
しかし、私はそれで運がありません。
たとえば、次の行があります。
xxxxxx
yyyyyy
zzzzzz
そして私はそれが次のようになりたいです:
xxxxxx
yyyyyy
zzzzzz
このためのコードは何ですか?
回答:
「空」の行にスペースまたはタブが含まれている可能性があります。POSIXクラスを使用しsed
て、空白のみを含むすべての行を削除します。
sed '/^[[:space:]]*$/d'
EGNを使用する短いバージョン(たとえば、gnu sed):
sed -r '/^\s*$/d'
(sedはPCREをサポートしていないことに注意してください。)
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
、
^\s*$
は、すべての「空の」行に一致します。ここで空とは、行に文字が含まれていないか、行に空の文字列(たとえばスペース)のみが含まれていることを意味します。一致するすべての行は、sedのd
コマンドで削除されます。
私にはawk
解決策がありません:
awk 'NF' file
どちらが返されますか:
xxxxxx
yyyyyy
zzzzzz
これはどのように作動しますか?NF
「フィールド数」を表すので、空の行にはフィールドが0になるため、awkは0を偽と評価し、行は出力されません。ただし、少なくとも1つのフィールドがある場合、評価はTrueになりawk
、デフォルトのアクションである現在の行を出力します。
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
ます: これをawkスクリプトに含めるための気の利いた方法、例えばパターンなどを知っていますか?awk '/ mypattern / {do stuff ...}'
awk 'NF {do stuff...}'
。
sed '/^$/d'
大丈夫なはずですが、ファイルを適切に変更することを期待していますか?その場合は、-i
フラグを使用する必要があります。
おそらくそれらの行は空ではないかもしれません。その場合は、この質問を見てください。txtfilesから空の行を削除し、行の先頭と末尾からスペースを削除してください私はあなたが達成しようとしていることだと思います。
sed -i '/^$/d'
それを行う1つの方法です。
[]
必要がありません、ここでコードが正しくないですので、ブラケット表現にエスケープする\[\[:space:\]\]
か\[ \t\]
-であるべき[[:space:]]
と[ \t]
。
これが最も簡単で最速の方法だと思います。
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
cat
、grep
ファイルもgrep . file.txt
grep '\S'
絶対にポータブルではありません。持っているgrep -P
場合は使用できますgrep -P '\S'
が、すべてのプラットフォームでサポートされているわけではありません。
grep .
他のソリューションと比較した場合の欠点は、すべてのテキストが赤で強調表示されることです。他のソリューションでは、元の色を維持できます。比較unbuffer apt search foo | grep .
にunbuffer apt search foo | grep -v ^$
ここで受け入れられた答えと上記の受け入れ られた答えの助けを借りて、私は使用しました:
$ 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への称賛
テキストファイルがWindowsで作成されたため、予期しない動作が発生している可能性が高いため、行末は\r\n
です。sedを実行する前にdos2unixを使用してUNIXスタイルのテキストファイルに変換するか、
sed -r "/^\r?$/d"
改行があるかどうかにかかわらず、空白行を削除します。
-r
フラグは何をしているのですか、それを組み合わせて-i
ファイルを直接変更し、画面に印刷されないようにすることは可能ですか?さらに、このコマンドは次のようにも機能すると思いますsed -r "/^\r$/d"
別のオプションなしsed
、awk
、perl
、など
strings $file > $output
strings-ファイル内の印刷可能な文字列を印刷します。
strings
の代わりにstring
?
私bash
固有の答えは、次のように、このためperl
のグローバルパターンg
フラグで置換演算子を使用することを推奨することです。
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
この回答は、空の行にスペースが含まれているかどうかの説明([\ ]*
)と、|
複数の検索語/フィールドを区切るための使用を示しています。macOS High SierraおよびCentOS 6/7でテスト済み。
FYI、OPの元のコードは、sed '/^$/d' $file
中だけで正常に動作しbash
、高性能スーパーコンピューティングクラスタでのMacOSハイシエラとCentOSの6/7 Linux上でターミナルを。