파일에 여러 문자열이 있고 각 문자열에 대해 명령을 실행하고 결과를 내보내야 합니다. 예는 다음과 같습니다.
파일.txt
string1
string2
string3
나는 뛰고있어:
while read in; do sigtool --hex-dump "$in"; done < file.txt > test.txt
이는 다음과 같은 출력을 제공합니다.
737472696e6731a737472696e6732a737472696e6733
출력을 다음과 같은 줄로 구분하고 싶습니다.
737472696e6731
737472696e6732
737472696e6733
이 목표를 어떻게 달성할 수 있나요?
답변1
당신은 개행을 원합니다. 따라서 개행 문자가 출력됩니다.
while read in; do sigtool --hex-dump "$in"; echo; done < file.txt > test.txt
추가된 명령어를 참고하세요 echo
.
제가 가장 먼저 확인해야 할 곳은 sigtool
맨 페이지에서 후행 개행 문자를 출력하는 옵션이 있는지 확인하는 것입니다.
글쎄, 나는 실제로 ( 패키지 sigtool
에서 ) 그것을 가져와 테스트하지 않고 위의 내용을 작성했습니다. clamav
이제 나는 그 일을 했습니다.
당신이 작성한 코드작동하지 않습니다.적어도 clamav-0.99.2-3.el6.x86_64는 할 수 없습니다. sigtool
입력을 수락표준 입력에 있습니다. 명령줄 인수를 수락하고 변환하는 옵션이 없습니다.
그래서 당신이 정말로 원하는 것은 다음으로 돌아가는 것입니다.내가 가장 좋아하는 비시각적 편집기ex
:
printf '%s\n' 'g/^/.!tr -d \\n | sigtool --hex-dump' %p | ex file.txt > test.txt
데모:
$ cat file.txt
string1
string2
string3
$ printf '%s\n' 'g/^/.!tr -d \\n | sigtool --hex-dump' %p | ex file.txt > test.txt
$ cat test.txt
737472696e6731
737472696e6732
737472696e6733
$
설명하다:
전역적으로(regex와 일치하는 모든 행 /^/
, 즉 모든 행에 대해) .!
쉘 파이프를 통해 각 행()을 필터링한 tr -d \\n | sigtool --hex-dump
다음 p
전체 버퍼()를 %
표준 출력으로 인쇄()하고 변경 사항을 file.txt
.
또 다른 방법은 Awk를 사용하는 것입니다.
awk -v p='sigtool --hex-dump' '
{printf "%s", $0 | p; close(p); printf "\n"}
' file.txt > test.txt
답변2
대체 폭력:
cat test.txt | sigtool --hex-dump | sed 's/0a/\n/g' > gzout.hex
ASCII 텍스트 파일을 다룰 때마다 16진수 개행 문자를 다시 변환하기만 하면 됩니다.
(ASCII가 아닌 언어를 다루는 경우 0a
입력에 개행 문자가 표시되지 않은 채 16진수 덤프가 발생할 수 있습니다.)