次の情報を含むファイルがあります。
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バージョンはsed
GNUと互換性がありません。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
- やめる