파이프를 통해 sed에 어떻게 연결합니까?

파이프를 통해 sed에 어떻게 연결합니까?

한 파일의 한 줄을 인쇄하여 다른 파일의 줄 교체를 위한 입력으로 사용하고 싶습니다.

sed -n '12p' FILE1 | sed -i '12c\ STDIN' FILE2

가능합니까?

답변1

나는 command 의 표준 입력 읽기를 지원하는 sed 구현을 알지 못하지만 cGNU sed에서는 r의사 파일 이름과 함께 명령을 사용한 /dev/stdin다음 d원래 줄을 삭제할 수 있습니다.

... | sed -i '12{
r /dev/stdin
d
}' FILE2

또는 -e체인 표현식을 더 간결하게 사용하세요.

... | sed -i -e '12{r /dev/stdin' -e 'd;}' FILE2

중괄호 는 rd명령을 그룹화하여 해당 주소에 대해 모두 실행되도록 합니다 12. 인수의 일부로 구문 분석되므로 12{r /dev/stdin; d;}단순히 사용할 수는 없습니다 .; d;}r

답변2

GNU를 사용 sed하고 동시에 백업 파일을 만듭니다.

sed -i.bak "12c$(sed -n '12p' file1)" file2

또는 휴대용 옵션

sed -i.bak "12s/.*/$(sed -n '12p' file1)/" file2

답변3

아니요, sed파이프라인 데이터는 교체 패턴이 아닌 작동 위치로 해석됩니다. 파일 이름을 제공하면 파이프가 무시됩니다. 명령 대체를 사용해야 합니다.

sed "12c$(sed -n 12p FILE1)" FILE2

또는 명명된 파이프를 통해 우회합니다.

mkfifo sedpipe
sed -n 12p FILE1 >sedpipe &
sed -i "12c$(cat sedpipe)" FILE2

관련 정보