xyz
한 줄에 해당하는 문자열이 있고 그 뒤에 나오는 모든 줄을 새 파일에 복사 file1.txt
하고 싶습니다 . 이 목표를 어떻게 달성할 수 있나요?xyz
file1.txt
file2.txt
나는 cat
명령을 알고 있습니다. 그런데 출발선을 어떻게 지정하나요?
답변1
GNU sed 사용
모든 줄 복사뒤쪽에 xyz
, 노력하다:
sed '0,/xyz/d' file1.txt >file2.txt
1,/xyz/
첫 번째 줄에서 시작하여 첫 번째 일치 항목으로 끝나는 줄 범위를 지정합니다 xyz
. d
sed에게 이 줄을 삭제하라고 지시하세요.
노트:BSD/MacOS에서는 sed가 작동 sed '1,/xyz/d' file1.txt >file2.txt
하지만 첫 번째 항목이 xyz
두 번째 줄 이상에 있는 경우에만 작동합니다. (모자 팁:선행.)
제안된 또 다른 접근 방식돈 크리스티, 다음에 적용해야 합니다.모두sed:
{ printf %s\\n; cat file1.txt; } | sed '1,/xyz/d' >file2.txt
예
다음 테스트 파일을 고려해보세요.
$ cat file1.txt
a
b
xyz
c
d
다음 명령을 실행하세요.
$ sed '1,/xyz/d' file1.txt >file2.txt
$ cat file2.txt
c
d
awk를 사용하세요
awk에도 동일한 논리를 사용할 수 있습니다.
awk 'NR==1,/xyz/{next} 1' file1.txt >file2.txt
NR==1,/xyz/{next}
awk에게 첫 번째( NR==1
)부터 정규식과 일치하는 첫 번째 줄까지 모든 줄을 건너뛰도록 지시합니다 xyz
. 1
나머지 모든 줄을 인쇄하도록 awk에 지시합니다.
답변2
그리고 ed
:
ed -s file.txt <<< $'/xyz/+1,$w file2.txt'
ed
이는 유선에서 다음으로 (원격) 명령을 보냅니다.뒤쪽에( )에는 +1
파일 ( ) 끝까지의 행이 기록되어 있습니다.xyz
$
w
file2.txt
답변3
그리고 csplit:
csplit -s file1.txt %xyz%1
답변4
$ sed -n '/xyz/,$p' file.txt > file2.txt
모든 줄이 인쇄되는 것을 -n
방지할 수 있습니다 . sed
with는 $
파일의 끝을 나타내고 end는 p
인쇄 라인을 나타냅니다. 즉 /xyz/$p
, 줄이 일치하면 xyz
파일 끝까지 인쇄합니다.