複数のキーワード間で段落を置き換える方法

複数のキーワード間で段落を置き換える方法

キーワード間の段落全体を変更しようとしています。

したがって:

   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行を挿入します。
  • エージェント以外の範囲内のすべての行を削除する
  • read コマンドはパターン空間に触れないため、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: 

関連情報