대체 단어는 두 번째 줄에 따라 다릅니다.

대체 단어는 두 번째 줄에 따라 다릅니다.

넷리스트 파일이 있습니다. 구분선이 있습니다. 구분 기호는 연속 줄의 시작 부분에 있는 "+"입니다.

MP1 Y A VDD VDD pch_25 W=1u L=550n M=1
MP0 Y B
+VDD VDD pch_25 W=1u L=550n M=1
MN1 v0 A VSS VSS nch_25_dnw W=500.0n L=550n M=1
MN0 Y B v0 VSS nch_25_dnw W=500.0n L=550n M=1

(완전한) 줄에 "pch_25"가 포함되어 있으면 각 줄의 시작 "M"을 "X"로 바꾸고 싶으므로 원하는 출력은 다음과 같습니다.

XP1 Y A VDD VDD pch_25 W=1u L=550n M=1
XP0 Y B
+VDD VDD pch_25 W=1u L=550n M=1
MN1 v0 A VSS VSS nch_25_dnw W=500.0n L=550n M=1
MN0 Y B v0 VSS nch_25_dnw W=500.0n L=550n M=1

다음과 같은 (작동하는) 명령이 있습니다.

sed -e :a -e '$!N;s/\n+/\\/;ta' -e 'P;D' file \
                                        | sed '/pch_25/s/^M/X/' | sed -e 's/\\/\n+/g'

sed이 명령을 파이프가 없는 명령으로 바꾸려면 어떻게 해야 합니까?

답변1

N;P;D일반적으로 모드에서 유사한 작업을 수행하여 sed버퍼에 항상 두 줄을 함께 유지하는 데 사용합니다. 불행하게도 넷리스트 파일은 레코드를 여러 줄로 분할할 수 있으므로 일반적인 솔루션은 작동하지 않습니다.

확실한 해결책은 함께 속하는 모든 행을 수집하는 루프를 추가하는 것입니다.

sed -e :a -e '/pch_25/s/^M/X/;/\n[^+]/!{N;ba' -e '};P;D' file           
  • /pch_25/s/^M/X/pch_25는 우리가 수행하려는 실제 교체입니다. 포함된 줄에서 s선행( ^앵커) 을 M로 바꿉니다 X.
  • 패턴은 \n[^+]개행 문자 뒤에 가 아닌 다른 문자가 오는 것을 정의합니다 +. 이는 우리가 너무 많은 행을 추가하여 루프를 종료해야 함을 나타냅니다. 즉, inversion 과 일치하면 !다음 줄을 추가 N하고 ba루프 마커로 점프 할 수 있습니다.:a
  • 마지막으로 P;D일반적으로 버퍼의 첫 번째 줄이 인쇄되고 삭제되며 새로운 루프가 시작됩니다. 예, 버퍼에 두 개 이상의 라인을 수집한 경우 첫 번째 라인만 인쇄되고 삭제됩니다. 하지만 문제 없습니다. 패턴이 +, not로 시작 M하고 다른 줄이 차례로 삭제되므로 다음 주기에서는 아무것도 교체되지 않습니다.

고급 솔루션: 이제 N;P;D점프 마커 와 b. 코드) :DDsed

sed '/pch_25/s/^M/X/;/\n[^+]/!N;//P;//!s/^/\n/;D' file
  • /\n[^+]/!N여전히 동일한 네트워크 레코드에 있는 경우 줄바꿈을 추가하세요.
  • //마지막 패턴을 반복합니다. 여기에는 반전이 없으므로 너무 많은 줄을 추가하면 P첫 번째 부분을 인쇄 할 수 있습니다.
  • //!s/^/\n/아직 레코드에 있는 경우 패턴 시작 부분에 개행 문자가 추가되므로 최종
  • D교체를 확인해야 하는 경우 다시 시작하기 전에 추가된 빈 줄만 제거되거나, 이미 다음 레코드에 있는 경우 인쇄된 첫 번째 줄이 제거됩니다.

불행하게도 \nGNU의 비표준 추가 기능이 replacement 에 사용되므로 sed이에 의존할 수 없으며 예약된 공간에 추가, 패턴 공간 지우기, x공간 변경 등 개행을 추가하는 다른 방법을 찾아야 합니다.

sed '/pch_25/s/^M/X/;/\n[^+]/!N;//P;//!{H;s/.*//;x;};D' file

관련 정보