다음 내용이 포함된 텍스트 파일이 있습니다.
abc.tar^@xxx.tar^@yyy.tar^@
예를 들어, 이라는 파일에 이 콘텐츠가 있고 abc.txt
해당 콘텐츠를 분할하여 처음 두 항목을 새 파일에 쓰고 싶습니다.
(예를 들어) 새 파일은 다음과 같습니다.
abc.tar^@xxx.tar^@
이 작업을 수행하는 명령이 있습니까?
답변1
이것은:
awk -F"@" '{print $1"@"$2"@"}' abc.txt > newfile.txt
당신에게 충분합니까?
답변2
다음을 실행해 보세요.
sed -r -i 's/^(.*)@.*@.*$/\1/' file
답변3
문제는 다음과 관련이 있는 것 같아요.저것, 옳은?
이 경우 "^@"를 줄바꿈으로 바꾸는 것이 더 가치가 있지 않습니까? 아래에서는 ASCII NUL 바이트인 "^@"을 의미하는 것 같습니다.
$ sed 's/\o000/\n/g' abc.txt | head -n 2
abc.tar
xxx.tar
그래서 당신은 필요
sed 's/\o000/\n/g' abc.txt | head -n 2 > newfile.txt
설명하다
이는 \n
각 NUL 바이트( )를 개행 문자( \o000
)로 대체합니다. 즉 \o
, 그 뒤에 8진수 표기법으로 바이트가 옵니다. 그런 다음 출력은 파이프로 연결되어 head -n 2
처음 두 줄을 추출합니다. 결과 줄은 >
파일로 리디렉션됩니다( ) newfile.txt
.
그러나 파일 이름을 "^@"로 구분하는 것이 중요한 경우 다음을 사용할 수 있습니다.
perl -nl000 -e '
$num_lines =2 ;
push @a,(split /\000/)[0..$num_lines-1];
print $_ for @a' abc.txt > newfile.txt
$num_lines
파일에서 첫 번째 줄을 가져오려면 필요에 따라 위의 값을 바꾸십시오 .$num_lines
설명하다
- 이
-n
스위치는perl
입력 파일의 각 줄에서 코드가 실행되도록 지시합니다. - 이
-l000
시퀀스는perl
출력 레코드 구분 기호(각 문자열 뒤에 인쇄되는 문자)가 NUL 바이트(000
)로 설정되었음을 나타냅니다. - 이 스위치는 다음 문자열이 실행될 코드임을
-e
나타냅니다 .perl
- 이
split
함수는 NUL 바이트를 구분 기호로 사용하여 각 입력 라인을 분할하고 첫 번째$num_lines
([0..$num_lines-1]
) 결과를 가져와 배열에 넣습니다@a
. 함수 호출에서는 "현재 입력 라인" 부분이 지정되지 않습니다. 이는 인수가 제공되지 않을 때 Perl()$_
의 기본 스칼라 변수가 함수(및 기타)의 기본 인수라는 사실을 활용합니다.split
- 마지막
foreach
루프는 각 요소를 인쇄합니다@a
($_
루프의 기본 반복자가 어떻게 되는지 다시 한번 확인하세요foreach
). 출력 레코드 구분 기호를 octal 로 설정했기 때문에000
이전과 같이 NUL 바이트로 구분된 결과를 얻습니다.
답변4
awk는 모든 문자를 레코드 구분 기호로 사용할 수 있지만(기본적으로 개행이 사용됨) 일부 구현에서는 null 바이트를 구분 기호로 지원하지 않습니다. Gawk(GNU awk)는 대부분의 비임베디드 Linux 설치의 기본 awk이며 null을 지원합니다.
gawk -v RS='\0' -v ORS='\0' 'NR <= 2 {print}'
gawk -v RS='\0' -v ORS='\0' 'NR <= 2'
레코드 인쇄가 기본 작업이므로 이 작업은 단축될 수 있습니다 .
대용량 파일의 경우 두 번째 줄 이후에 종료하는 것이 가장 좋습니다.
gawk -v RS='\0' -v ORS='\0' 'NR==3 {exit} {print}'
또는 를 사용할 수 있습니다 head
. 레코드 구분 기호로 줄 바꿈 대신 널 바이트를 사용하는 옵션은 없지만 두 문자를 바꾸고 를 호출한 head
다음 다시 바꿀 수 있습니다.
tr '\0\n' '\n\0' | head -n 2 | tr '\0\n' '\n\0'