두 개 이상의 키워드 사이에서 단락을 바꾸는 방법

두 개 이상의 키워드 사이에서 단락을 바꾸는 방법

키워드 사이의 전체 단락을 바꾸려고 합니다.

따라서:

   port: 6666
    socks-port: 6699
    redir-port: 6669
    allow-lan: true
    mode: Rule
    log-level: info
    external-controller: 0.0.0.0:9090
    
    dns:
  enable: true
  ipv6: false
  # listen: 0.0.0.0:53
  # enhanced-mode: fake-ip
  nameserver:
    - 223.5.5.5
    - 114.114.114.114
  #  - 'tls://dns.rubyfish.cn:853'
  #fallback:
  #  - 'tcp://208.67.222.222:443'
  #  - 'tls://1.0.0.1:853'
  #  - 8.8.8.8
    proxies:
      - type: ss
        server: test.com
        
    proxy-groups:
    
      - name: 

답변1

대체 텍스트가 file1다음과 같은 경우(마지막 줄 추가)

dns:
   enable: true
   enhanced-mode: redir-host # 或 fake-ip
   listen: 0.0.0.0:53
   nameserver:
      - 223.5.5.5
experimental:
   interface-name: Ethernet # 物理网卡名称
proxies:

조금 검색해 보니 sed주소 범위가 탐욕스럽지 않은 것 같아서 이렇게 하면 됩니다.

sed -e "/^    proxies:/ r file1" -e "/dns:/,/proxies:/d" file

송곳

r읽고 일치시킨 후 file1원본에 추가하세요.file/^ proxies:/

sed -e "/^    proxies:/ r file1"

/dns:/그런 다음 전체를 다시 처리하고 첫 번째 일치부터 ,첫 번째 일치 까지의 행 범위를 캡처 /proxies:/하고 d삭제합니다 .

    -e "/dns:/,/proxies:/d" file

sed위에 유용한 자료가 있습니다그림 모어.

댓글을 업데이트하려면 수정하세요.

다른 proxies:줄은 줄 시작 부분에 4개의 공백이 있다는 점에서 목표와 다릅니다(다른 줄은 4개 이상). 포함하려는 교체 항목을 고정하면 ^관심 있는 교체 항목만 선택되므로

sed -e "/^    proxies:/ r file1" -e "/dns:/,/proxies:/d" file

위의 삽입물을 사용하면 file1다음이 생성됩니다.

   port: 6666
    socks-port: 6699
    redir-port: 6669
    allow-lan: true
    mode: Rule
    log-level: info
    external-controller: 0.0.0.0:9090
    
dns:
   enable: true
   enhanced-mode: redir-host # 或 fake-ip
   listen: 0.0.0.0:53
   nameserver:
      - 223.5.5.5
experimental:
   interface-name: Ethernet # 物理网卡名称
proxies:
      - type: ss
        server: test.com
        
    proxy-groups:
    
      - name: 

답변2

sed를 사용하면 필요한 것을 얻을 수 있습니다.

sed -e '
  /dns:/,/proxies:/!b
  /dns:/r file1
  /proxies:/!d
' file

설명하다:

  • 범위 밖의 행은 그대로 인쇄됩니다.
  • 범위는 DNS 라인의 시작과 프록시의 끝입니다.
  • 범위 내에서 stdout 스트림에 dns 행을 삽입합니다.
  • 상담원을 제외하고 범위 내 모든 행 삭제
  • 읽기 명령은 패턴 공간을 건드리지 않으므로 dns를 제거하면 여전히 읽기 파일 file1이 인쇄됩니다.

답변3

file1대체 텍스트가 포함되어 있다고 가정합니다 .

$ cat file1
dns:
   enable: true
   enhanced-mode: redir-host # 或 fake-ip
   listen: 0.0.0.0:53
   nameserver:
      - 223.5.5.5
experimental:
   interface-name: Ethernet # 物理网卡名称

file2모든 UNIX 시스템에서 awk를 사용하여 쉘의 텍스트 입력에 변경 사항을 적용하려는 파일 입니다 .

$ cat tst.awk
NR == FNR { new = (NR>1 ? new ORS : "") $0; next }
$1 == "dns:" { print new; f=1 }
$1 == "proxies:" { f=0 }
!f

.

$ awk -f tst.awk file1 file2
   port: 6666
    socks-port: 6699
    redir-port: 6669
    allow-lan: true
    mode: Rule
    log-level: info
    external-controller: 0.0.0.0:9090

dns:
   enable: true
   enhanced-mode: redir-host # 或 fake-ip
   listen: 0.0.0.0:53
   nameserver:
      - 223.5.5.5
experimental:
   interface-name: Ethernet # 物理网卡名称
    proxies:
      - type: ss
        server: test.com

    proxy-groups:

      - name: 

관련 정보