XYより短い線を削除する方法は?


29

2048文字より長い行を削除する方法についての質問を見つけました:

XYより長い場合に行を削除する方法は?

Q:しかし、どのようにして4文字より短い行を削除できますか?したがって、ファイル内の長さが1または2または3の行を削除します。

更新:多くの良い答えをありがとう、しかし、私は1つだけをOKとマークすることができます

回答:


42

使用できますsed。以下は、3文字以下の行を削除します。

sed -r '/^.{,3}$/d' filename

ファイルへの変更をインプレースで保存するには、-iオプションを指定します。

お使いのバージョンがsed拡張RE構文をサポートしていない場合、BREで同じことを書くことができます。

sed '/^.\{,3\}$/d' filename

すべてのsedバリアントで機能します。


また、使用することができますawk

awk 'length($0)>3' filename

を使用してperl

perl -lne 'length()>3 && print' filename

sed '/^.\{,3\}$/d'BSD sedでは動作しません:sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s)。sed -rバージョンは構文的には有効ですが、行を削除しません。
デレクソン

5

いくつかのバリエーション:

grep .... file

または

sed '/..../!d' file

または

sed -n 's/./&/4p' file

または

awk 'gsub(/./,"&")>3' file

または

awk 'length>3' file

またはGNU awk:

awk 'NF>3' FS= file

1
ああ、そのgrep ....はとてもエレガントです!
grofte

3

以下は、VimのExモードとglobalコマンドを使用したVimソリューションです。

これはを使用するのと非常に似てsedいますが、特殊な文字( '{'、 '}')をエスケープする必要があるだけです。

:g/^.\{,3\}$/d

VimのVery Magic Regexモード(\ v)を使用すると、このエスケープを回避できます。

:g/\v^.{,3}$/d

:help magicも参照してください

Use of "\v" means that in the pattern after it all ASCII characters except
'0'-'9', 'a'-'z', 'A'-'Z' and '_' have a special meaning.  "very magic"

また、時に役立つこともありvglobalます。

:v/\v^.{,3}$/d

3文字までの行を除くすべてを削除します。


1

できる行を直接削除するには:

sed -ri '/.{4}/!d' /path/to/file

またはBRE:

sed -i '/.\{4\}/!d' /path/to/file

行に4文字以上が含まれていない場合は削除されます。

f=/path/to/file
cat <<GREP >"$f"
    $(grep -E ".{4}" "$f")
GREP

コマンド置換サブシェルで上記の操作を行うと、grepcatが書き込みを開始する前に読み取り記述子を取得できます<<HEREDOCが、結果がストリーミングされたままになり、引数の長さエラーが発生しなくなります。



0

以下を使用できますgrep

行の長さの先頭のスペースを数える場合:

grep -e '[^\ ]\{4,\}' file

行リーニングの先頭のスペースをカウントしない場合:

grep -e '[^\]\{4,\}' file
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.