쉬운 직업 ed
:
ed -s file1 <<IN
/Pointer/-r file2
,p
q
IN
-r file1
지정된 파일에서 지정된 행 다음으로 읽습니다.이 경우 첫 번째 행이 일치하는 이전 행 Pointer
입니다. 따라서 여러 줄에서 발생 file2
하더라도 내용을 한 번만 삽입합니다 Pointer
. 일치하는 각 줄 앞에 g
lobal 플래그를 추가하려면 다음을 입력하십시오 .
ed -s file1 <<IN
g/Pointer/-r file2
,p
q
IN
교체 ,p
로 w
당신이 현재 위치에서 파일을 편집 할 경우.
허용되는 sed
답변은 대부분의 경우 작동하지만 마커가 마지막 줄에 있으면 명령이 예상대로 작동하지 않습니다 File1
. 마커 뒤에 내용을 삽입합니다 .
나는 처음에 시도했다 :
sed '/Pointer/{r file1
N}' file2
이것도 잘 작동 r
하지만 (사이클 끝에서 마술 처럼 ) 마커가 마지막 줄에 있으면 같은 문제가 있습니다 (마지막 N
줄 뒤에 연장선 이 없습니다 ). 이를 해결하기 위해 입력에 개행을 추가 할 수 있습니다.
sed '/Pointer/{ # like the first one, but this time even if the
r file1 # marker is on the last line in File2 it
N # will be on the second to last line in
} # the combined input so N will always work;
${ # on the last line of input: if the line is
/^$/!{ # not empty, it means the marker was on the last
s/\n$// # line in File2 so the final empty line in the
} # input was pulled i\n: remove the latter;
//d # if the line is empty, delete it
}' file2 <(printf %s\\n)
file2
일치하는 각 줄 앞에 내용 을 삽입 합니다. 첫 번째 일치하는 줄 l
앞에만 삽입하려면 oop를 사용하고 n
파일 끝이 나올 때까지 ext 행을 당기십시오 .
sed '/Pointer/{
r file2
N
:l
$!n
$!bl
}
${
/^$/!{
s/\n$//
}
//d
}' file1 <(printf %s\\n)
이러한 sed
솔루션을 사용하면 내부 편집 기능이 손실되지만 다른 파일로 리디렉션 할 수 있습니다.