2016-10-25 8 views
0

数千のファイルがあり、パターンに従う行をいくつか削除する必要があるので、正規表現を使ってSEDに行きました。このREGEXパターンの行を削除するためのSED

A,12121212121212,foo,bar,lorem 
C,32JL,JL 
C,32JL,JL 
C,32JL,JL 
C,32JL,JL 
A,21212121212121,foo,bar,lorem 
C,32JL,JL 
C,32JL,JL 
C,32JL,JL 
A,9999,88888,77777 

ように私は "" で始まり、 "Loremの"

C,32JL,JL 
C,32JL,JL 
C,32JL,JL 
C,32JL,JL 
C,32JL,JL 
C,32JL,JL 
C,32JL,JL 
A,9999,88888,77777 
出力 - 期待

で終わるすべての行を削除する必要があります

私は正規表現作った:

^(A).*(lorem) 

をそしてそれは私のテキストエディタ(崇高、ウルトラエディット)に一致

UNIXシェルで

sed '/^(A).*(lorem)/d' file.txt 

しかし、どういうわけか、それはしていません仕事、それはファイル全体を表示し、私は理由を把握することはできません。

誰かが私を助けてくれますか?

+4

'sed'では、括弧はリテラル文字として扱われています。あなたがそれらをエスケープする必要がある場合は、それらをエスケープする必要がありますが、この正規表現のためにグループ化する必要はありませんので、今度はそれらを取り除くように –

+0

私は今あなたの助けを歓迎します。 – Imkls

+2

あなたはまた、 grep -vx 'A. * lorem' file.txt' – Sundeep

答えて

2
$ sed '/^A.*lorem$/d' file.txt 
  • ^Aは:A
  • .*で始まる:真ん中
  • lorem$中のもの:ブラケットを取り外しlorem
+0

ありがとう、それは今動作します。私はあなたの説明を持っています:) – Imkls

1

で終わります。あなたがよりrigourousになりたい場合は、より正確

sed '/^A.*lorem$/d' file.txt 
AS-正規表現を終了ジェームズの答えを見ることができます

sed '/^A.*lorem/d' file.txt 

becomes-あなたのコード、適切なワンライナーを使用して

どちらも動作します。

+0

ありがとう、それは今働いています:) – Imkls

+0

'{}'編集ボタンを使うか、コードを含む行を選択し、 'Ctrl + k'を押します。 – Sundeep

+0

@Sundeep、それは私が通常は長い通路のためにすることです。しかし、この1つのライナーのために、私はちょうどバックティック( ')で行った。情報をありがとう! – VM17

4

他はあなたに正しい解決策を教えましたが、正規表現が機能しなかった理由を説明しませんでした。 ()は確かに無駄でしたが、他のツールや言語で正規表現を使用していた場合、期待した結果が得られた可能性があります。 ()はリテラル文字にマッチしますしながら、それはデフォルトでは、グループ化のための文字が\(\)あるPOSIX's basic regular expressionsを、使用するため

それはsedでは動作しませんでした。あなたの入力テキストにそのような角括弧がなかったので、それは一致しませんでした。

あなたは()をグループ化するために使用されていると\(\)リテラル括弧にマッチPOSIXの拡張正規表現にGNUのsed -rやBSDのsed -E、フラグ切替を使用した場合あなたの正規表現は、働いているだろう。結論として

、次のコマンドは、同じことを行います:(BSD SEDで)

  • sed '/^A.*lorem$/d' file.txt
  • sed -r '/^(A).*(lorem)$/d' file.txt(GNUは、sedので)
  • sed -E '/^(A).*(lorem)$/d' file.txt
  • sed '/^\(A\).*\(lorem\)$/d' file.txt
+1

は、いくつかのsedバージョンが '-r'ではなく' -E'を使うことを追加することもできます。 – Sundeep

+0

ありがとう、私はいつもGNUがすべてではないことを忘れています。編集されました! – Aaron

関連する問題