저는 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를 사용하는 경우에는 -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