키워드 사이의 전체 단락을 바꾸려고 합니다.
따라서:
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: