![sed를 사용하여 두 번째 패턴 발생 위치에 줄 삽입](https://linux55.com/image/181556/sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%91%90%20%EB%B2%88%EC%A7%B8%20%ED%8C%A8%ED%84%B4%20%EB%B0%9C%EC%83%9D%20%EC%9C%84%EC%B9%98%EC%97%90%20%EC%A4%84%20%EC%82%BD%EC%9E%85.png)
다음 두 가지 명령줄 세트가 있습니다.
make PREFIX=/usr \
SHAREDIR=/usr/share/hwdata \
SHARED=yes
make PREFIX=/usr \
SHAREDIR=/usr/share/hwdata \
SHARED=yes \
install install-lib
두 번째 행 앞에 행을 삽입하고 싶습니다 make PREFIX=/usr
.
내가 시도한 것은 다음과 같습니다.
sed -e "/make PREFIX=\/usr/i\ sed -e '/\\\\\$(DIRINSTALL) -m 755 \\\\\$(DESTDIR)\\\\\$(SBINDIR)/ s/^/#/' \\\\\n\ -e '/\\\\\$(DIRINSTALL) -m 755 \\\\\$(DESTDIR)\\\\\$(LIBDIR)/ s/^/#/' \\\\\n\ -e 's/pci \\\\\$(DESTDIR)\\\\\$(PKGCFDIR)/pci/' \\\\\n\ -i Makefile" \
>> $Output
$Output
스크립트 파일의 이름입니다.
올바른 sed 명령(아래 참조)을 생성하지만(일부 \'는 표시에서 손실됨) 물론 두 모드 위에 줄을 배치합니다. 위에서 언급한 다양한 개선 사항을 시도했지만 성공하지 못했습니다. 두 번째 항목 위에 어떻게 삽입합니까? 죄송합니다. Google에서는 아직 정보를 제공하지 않았습니다. 저는 이것을 Bash 스크립트로 작성하고 있으므로 sed나 awk를 적용하는 것이 가장 쉽습니다. 나는 Perl을 이해하지 못하기 때문에 그것을 사용하고 싶지 않습니다.
이것이 내가 삽입하려는 행입니다. Bash 스크립트에서는 다음과 같이 표시되어야 합니다.
sed -e '/\$(DIRINSTALL) -m 755 \$(DESTDIR)\$(SBINDIR)/ s/^/#/' \
-e '/\$(DIRINSTALL) -m 755 \$(DESTDIR)\$(LIBDIR)/ s/^/#/' \
-e 's/pci \$(DESTDIR)\$(PKGCFDIR)/pci/' \
-i Makefile
답변1
이렇게 하면 작동합니다...첫 번째 발생을 건너뜁니다.
sed -i -E '0,/make PREFIX/! s/(make PREFIX)/\n\1/' file.txt
파일.txt
make PREFIX=/usr
SHAREDIR=/usr/share/hwdata
SHARED=yes
make PREFIX=/usr
SHAREDIR=/usr/share/hwdata
SHARED=yes
install install-lib
답변2
heredocs <<
명령줄에서 인용 및 백슬래시 문제를 방지하는 매우 편리한 방법입니다.
코드를 sed에 전달하면 첫 번째 make 명령을 찾은 후 다음 명령으로 점프합니다. 이 시점에서 삽입이 완료되고 그 시점부터 다른 것에 신경 쓰지 않고 eof 쪽으로 미끄러집니다.
sed -f - file <<\eof
/make PREFIX=\/usr/!b
:a;n;//!ba
i\
sed -e '/\\$(DIRINSTALL) -m 755 \\$(DESTDIR)\\$(SBINDIR)/ s/^/#/' \\\
-e '/\\$(DIRINSTALL) -m 755 \\$(DESTDIR)\\$(LIBDIR)/ s/^/#/' \\\
-e 's/pci \\$(DESTDIR)\\$(PKGCFDIR)/pci/' \\\
-i Makefile
:b;n;bb
eof
이는 예상 출력을 기반으로 합니다.
답변3
한 가지 방법은 다음과 같습니다 awk
.
awk '
index($0, "make PREFIX=/usr") && (++c == 2){
print "sed -e \047/\\$(DIRINSTALL) -m 755 \\$(DESTDIR)\\$(SBINDIR)/ s/^/#/\047 \\"
print " -e \047/\\$(DIRINSTALL) -m 755 \\$(DESTDIR)\\$(LIBDIR)/ s/^/#/\047 \\"
print " -e \047/s/pci \\$(DESTDIR)\\$(PKGCFDIR)/pci/\047 \\"
print " -i Makefile"
}
1 # print current line
' file
문자열이 make PREFIX=/usr
현재 행(색인 > 0)에 존재하는 경우 변수는 미리 증가되어 c
와 비교됩니다 2
. 조건이 true이면 삽입할 문자열을 출력합니다. 그런 다음 현재 줄을 인쇄합니다. 작은따옴표는 8진수로 작성됩니다 \047
.
답변4
"make PREFIX" 줄 앞의 내용을 바꾸기 위해 "contentneed_to_replace" 변수를 사용합니다.
for i in `sed -n '/make PREFIX/{;=;p}' o.txt| sed -n '1~2p'| sed -n '2p'`
do
contentneed_to_replace="praveen"
sed ''$i's/make PREFIX.*/'$contentneed_to_replace'\n&/g' o.txt
done
산출
make PREFIX=/usr \
SHAREDIR=/usr/share/hwdata \
SHARED=yes
praveen
make PREFIX=/usr \
SHAREDIR=/usr/share/hwdata \
SHARED=yes \
install install-lib