sedを使用してファイルリストから文字列を削除できませんでした。

sedを使用してファイルリストから文字列を削除できませんでした。

私は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を使用する場合は、-Zinオプションが必要です。grep-0xargs

エラー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てください。ファイル名に改行文字がない場合に機能します。-0xargs

関連情報