-2

これは私にはうまくいきません

grep -vE '^\..*' tmp1.txt >grep.txt
grep -vE '^le-.*\.sh' grep.txt >tmp1.txt

前のtmp1.txt

.config
le-test.sh
a b c

.config
le-test.sh
a b c

誰か助けますか?

4

2 に答える 2

1

使用するgrepは次のとおりです。grep -vE "^\.|^le-[^.]+\.sh" FILE

于 2013-03-24T22:10:35.087 に答える
1

実行すると何が表示されますか:

$ grep -vE '^\.' tmp1.txt
le-test.sh
a b c
$ grep -E '^\.' tmp1.txt
.config
$ 

(正規表現の末尾.*は、データの行を追加または削除しません)。あなたは私が示すものを見るはずです。grep私が示しているものが実際に表示されていない場合は、のバージョンがオプションで何をするかを確認する必要があり-Eます。egrep正規表現が拡張されているのではなく、拡張された正規表現で「-mode」を有効にする必要があります。試す:

$ grep -e '^\.' tmp1.txt
.config
$ grep -ve '^\.' tmp1.txt
le-test.sh
a b c
$ 

小文字-eは、次の引数が正規表現であることを示しています。それでも出力が表示されない場合は、通常のバージョンのを使用していない可能性がありますgrep。実行しているものを確認する必要があります。実行してみる/usr/bin/grepか、それがGNUバージョンであるかどうかをテストすることができますgrep --version

ろ過の最初のフェーズで表示された出力を取得できると仮定すると、2番目のフェーズも機能するはずです。le-'で始まり'で終わるファイルを削除したいとしますが、2番目の正規表現は開始後に.shのみ必要です。終わりを指定しません:.shle-

$ grep -vE '^\.' tmp1.txt | grep -E '^le-.*\.sh$'
le-test.sh
$ grep -vE '^\.' tmp1.txt | grep -vE '^le-.*\.sh$'
a b c
$ 

悲しみの考えられる原因の1つは、データファイルにWindowsの行末(CRLF)が含まれているが、Unixでテストを実行している場合です。行の終わりの前に\.sh$CR(キャリッジリターン)もあるため、正規表現の一部は失敗します。'\r'ただし、これはフィルタープロセスの最初の部分には影響しません。

次のコマンドを使用して、すべてを1つのコマンドで実行できるはずです。

$ grep -E '^(\.|le-.*.sh$)' tmp1.txt
.config
le-test.sh
$ grep -vE '^(\.|le-.*.sh$)' tmp1.txt
a b c
$ 

-Eこのバージョンにはフラグが必要です。グループ化のための交互|と括弧はそれを必要とします。

于 2013-03-24T22:41:27.587 に答える