多くの行があるファイルで、HERE IT IS
で始まる行を削除します。
コマンドラインツールのみを使用してこれを行うにはどうすればよいですか?
sed
を試してください:
sed -i '/^HERE IT IS/d' <file>
警告:sed
の-i
スイッチを使用する場合は、バックアップを取る方が適切です:
sed -i.bak '/^HERE IT IS/d' <file>
元のファイルは<file>.bak
のままで、変更されたファイルは<file>
のままです。
受け取った非常に優れたgrep
とsed
の回答に加えて、同じことを行うことができる他のツールがいくつかあります。
Perlのいくつかの方法:
Perl -ne '/^HERE IT IS/ || print' file > newfile
Perl -ne 'print if !/^HERE IT IS/' file > newfile
Perl -ne 'print unless /^HERE IT IS/' file > newfile
-i
スイッチを任意の例に追加して、ファイルをその場で編集できます。
Perl -i.bak -ne '/^HERE IT IS/ || print' file
(g)awk
awk '!/^HERE IT IS/' file > newfile
GNU awk
(Linuxではデフォルトのawk
)の新しいバージョン(4.1.1以降)もファイルをその場で編集できます。
gawk -i inplace '!/^HERE IT IS/' file
シェル(bash
、zsh
、ksh
、おそらくその他)。これはちょっと馬鹿げていますが、canできますが、他のツールの方が優れています。
while IFS= read -r line; do
[[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
done < file > newfile
grep
を使用してそれらを除外します。例えば :
grep -v "^HERE IT IS" infile > outfile
次に、outfileをinfileに戻します。
sed
は間違いなく道です。
コマンド@heemaylのこのわずかな変更は、パターン参照のIが原因で、同じケースがパターンで使用されているかどうかにかかわらず、行を削除します。
sed -i '/HERE IT IS/Id' <file>
これを実行したいディレクトリに複数のファイルがある場合は、そのようなファイルをfindと組み合わせることができます。
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
Maxdepthオプションは、これがディレクトリに再帰しないことを意味します。
Grep
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)
負の先読みアサーション。正規表現エンジンがすべての行開始境界に一致するようにします(これは通常^
と一致します)後に文字列HERE IT IS
が続かない場合のみ
python
#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
for line in f:
if not line.startswith('HERE IT IS'):
print(line, end="")
スクリプトをファイルに保存し、script.py
と言ってから、ターミナルで以下のコマンドを実行します。
python3 script.py infile
別のpythonオプション:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
ここで、fは引用符で囲まれたファイルへのパスです。
ExモードでVimを使用できます。
ex -sc 'g/^HERE IT IS/d' -cx file
g
グローバル検索
d
delete
x
保存して閉じる