![파이프를 통해 sed에 어떻게 연결합니까?](https://linux55.com/image/208916/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%A5%BC%20%ED%86%B5%ED%95%B4%20sed%EC%97%90%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%97%B0%EA%B2%B0%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
한 파일의 한 줄을 인쇄하여 다른 파일의 줄 교체를 위한 입력으로 사용하고 싶습니다.
sed -n '12p' FILE1 | sed -i '12c\ STDIN' FILE2
가능합니까?
답변1
나는 command 의 표준 입력 읽기를 지원하는 sed 구현을 알지 못하지만 c
GNU sed에서는 r
의사 파일 이름과 함께 명령을 사용한 /dev/stdin
다음 d
원래 줄을 삭제할 수 있습니다.
... | sed -i '12{
r /dev/stdin
d
}' FILE2
또는 -e
체인 표현식을 더 간결하게 사용하세요.
... | sed -i -e '12{r /dev/stdin' -e 'd;}' FILE2
중괄호 는 r
및 d
명령을 그룹화하여 해당 주소에 대해 모두 실행되도록 합니다 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