これは私にはうまくいきません
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
誰か助けますか?
使用するgrepは次のとおりです。grep -vE "^\.|^le-[^.]+\.sh" FILE
実行すると何が表示されますか:
$ 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
のみ必要です。終わりを指定しません:.sh
le-
$ 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
このバージョンにはフラグが必要です。グループ化のための交互|
と括弧はそれを必要とします。