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입력 파일 이름을 끝내기 위해 공백 대신 null 문자를 찾습니다. 이로 인해 발견된 모든 파일이 grep개별 파일이 아닌 하나의 긴 문자열로 연결됩니다.

자세한 내용은 다음을 참조하세요 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.

일반적으로 grepxargs기타 명령은 구분 기호로 줄 바꿈이나 공백을 사용합니다. 하지만 데이터에 공백이 있을 때 유용한 null을 사용하도록 요청할 수 있습니다.

xargs옵션을 사용하여 -0입력이 null로 구분되어 있음을 알리고, 또는 null로 구분된 출력을 생성하도록 지시합니다 grep.-Z--null

grep지원하지 않는다면 제거 -Z하세요. 파일 이름에 개행 문자가 없으면 작동합니다.-0xargs

관련 정보