私はbash(Mac OS X)を使用しています。削除したい文字列を含むファイルのリストがあります。
$ grep -l \</html\> *.html
21888601.html
21906283.html
21977081.html
...
一致するすべてのファイルの名前はこの形式(.html)で指定されます。それからこれを試してください。
$ grep -l \</html\> 27776977.html | xargs -0 sed -i.back '/<\/html>/d'
シェルはgrepから返されたファイルのリストとエラーを出力します。
sed: 21888601.html
21906283.html
21977081.html
...
: File name too long
このファイル名は明らかに長すぎないため、ここには別のエラーがあります。また、アルファベット名(すべての数字ではない)を持つファイルでこれをテストしてもエラーは発生しません。
私も次のことを試しました。
$ grep -l \</html\> 27776977.html | xargs -0 sed -i.back '/<\/html>/d'
sed: 27776977.html
: No such file or directory
$ grep -l \</html\> 27776977.html
27776977.html
sedは数値ファイル名を処理できませんか?それともここに他の質問がありますか?
答え1
-0
このオプションを使用するため、xargs
入力ファイル名を終了するためにスペースの代わりにヌル文字を探します。これにより、見つかったすべてのファイルがgrep
個々のファイルではなく1つの長い文字列にリンクされます。
詳細については、以下を参照してくださいman xargs
。
-0, --null
Input items are terminated by a null character instead of by whitespace, and the quotes and
backslash are not special (every character is taken literally). Disables the end of file
string, which is treated like any other argument. Useful when input items might contain white
space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for
this mode.
この場合、ファイル名に特殊文字がないため、その-0
オプションを削除する必要があります。
答え2
withを使用する場合は、-Z
inオプションが必要です。grep
-0
xargs
エラーfile name to long
リストに関連付けられているすべてのファイル名が表示されることがわかります。
man grep
:
-Z, --null
Output a zero byte (the ASCII NUL character) instead of the character that normally follows a file name.
For example, grep -lZ outputs a zero byte after each file name instead of the usual newline. This option
makes the output unambiguous, even in the presence of file names containing unusual characters like
newlines. This option can be used with commands like find -print0, perl -0, sort -z, and xargs -0 to
process arbitrary file names, even those that contain newline characters.
通常、grep
およびxargs
他のコマンドは区切り文字として改行またはスペースを使用します。ただし、データにスペースがある場合に便利なnullを使用するように要求できます。
xargs
オプションを使用して、-0
入力がnullで区切られていることを知らせるか、またはnullで区切られた出力を生成するように指示しますgrep
。-Z
--null
grep
サポートしていない場合は削除し-Z
てください。ファイル名に改行文字がない場合に機能します。-0
xargs