大文字と小文字を区別しない一致を含む行を削除します。

大文字と小文字を区別しない一致を含む行を削除します。

次の情報を含むファイルがあります。

20    BaDDOg
31    baddog
42    badCAT
43    goodDoG
44    GOODcAT

単語を含むすべての行を削除したいですdog。これが私が望む結果です:

42    badCAT
44    GOODcAT

ただし、dog大文字と小文字を区別しません。

sedコマンドが使えると思いましたが、sed -e "/dog/id" file.txtうまく動作しないようです。これは私がOSXで作業することに関連していますか?使用できる他の方法はありますか?

答え1

努力するgrep

grep -iv dog inputfile

-i大文字と小文字の-v一致を無視します。

使用したい場合は、sed次のようにできます。

sed '/[dD][oO][gG]/d' inputfile

GNUsed拡張パターンマッチング修飾子を使用すると、I一致は大文字と小文字を区別しませんが、すべてのスタイルで機能するわけではありませんsed

sed '/dog/Id' inputfile

しかし、OS Xでは動作しません。

答え2

OSXバージョンはsedGNUと互換性がありません。iマニュアルページに示すように、フラグが完全に欠落しています。

The value of flags in the substitute function is zero or more of the following:
   N       Make the substitution only for the N'th occurrence of the regular expression in
           the pattern space.
   g       Make the substitution for all non-overlapping matches of the regular expression,
           not just the first one.
   p       Write the pattern space to standard output if a replacement was made.  If the
           replacement string is identical to that which it replaces, it is still considered
           to have been a replacement.
   w file  Append the pattern space to file if a replacement was made.  If the replacement
           string is identical to that which it replaces, it is still considered to have
           been a replacement.

gsed以下を使用してインストールできます。醸造コマンドの使用

brew install gnu-sed

その後、次のように大文字と小文字を区別しないフラグでsedを使用できます。

gsed '/dog/Id' inputfile

答え3

OSXが編集されているようだからhttps://ss64.com/osx/、"dog"に一致する行を削除するように要求できます。残念ながら、大文字と小文字の区別は直接行う必要があります。

ed -s file.txt <<< $'1,$g/[dD][oO][gG]/d\nw\nq'

コマンドはここの文字列に与えられ、次の順序で区切られます。

  • アドレス範囲内1,$(フルファイル)
  • g--次の正規表現に一致する行にグローバルに後続のコマンドを適用します。
  • /[dD][oO][gG]/- "dog"と一致し、大文字と小文字を区別しません。
  • d--適用されるコマンドは「削除」です。
  • w- 更新されたファイルをディスクに書き込む
  • q- やめる

関連情報