한 줄씩 명령을 실행하고 같은 방식으로 내보냅니다.

한 줄씩 명령을 실행하고 같은 방식으로 내보냅니다.

파일에 여러 문자열이 있고 각 문자열에 대해 명령을 실행하고 결과를 내보내야 합니다. 예는 다음과 같습니다.

파일.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진수 덤프가 발생할 수 있습니다.)

관련 정보