使用sed向SOCKS5监听块追加内容时出现重复行问题
解决sed在SOCKS5监听块追加map内容时重复打印最后一行的问题
原配置文件
listener SOCKS5{ address *:4435 secure 1 keyFile /etc/letsencrypt/live/ajildoost.org.co/privkey.pem certFile /etc/letsencrypt/live/ajildoost.org.co/fullchain.pem map ajildoost ajildoost.org.co map astanehbadam astanehbadam.org.co, zagrev.astanehbadam.org.co, phone.astanehbadam.org.co map ntfy ntfy.uptimekuma.org.co map uptimekuma monitor.uptimekuma.org.co map samphone samphone.org.co, zagrev.samphone.org.co, phone.samphone.org.co map jellyfin.uptimekuma.org.co jellyfin.uptimekuma.org.co map trilium.uptimekuma.org.co trilium.uptimekuma.org.co map ocserv.uptimekuma.org.co ocserv.uptimekuma.org.co map seafile.uptimekuma.org.co seafile.uptimekuma.org.co map access access.uptimekuma.org.co map gilan-rice gilan-rice.org.co, zagrev.gilan-rice.org.co } listener SOCKS4{ address *:80489 secure 0 map astanehbadam astanehbadam.org.co map ajildoost ajildoost.org.co map uptimekuma monitor.uptimekuma.org.co map ntfy ntfy.uptimekuma.org.co map samphone samphone.org.co, zagrev.samphone.org.co, phone.samphone.org.co map jellyfin.uptimekuma.org.co jellyfin.uptimekuma.org.co map trilium.uptimekuma.org.co trilium.uptimekuma.org.co map ocserv.uptimekuma.org.co ocserv.uptimekuma.org.co map seafile.uptimekuma.org.co seafile.uptimekuma.org.co map access access.uptimekuma.org.co map gilan-rice gilan-rice.org.co, zagrev.gilan-rice.org.co }
尝试的sed命令
sed -n '/listener SOCKS5{/,/}/{ /map/ {h; } /}/ { x s/$/\nmap appended }/ # Modify the last "map" line. p d } p }' "$FILE"
问题现象
命令能实现追加内容,但最后一条map条目被重复打印,输出如下:
listener SOCKS5{ address *:4435 secure 1 keyFile /etc/letsencrypt/live/ajildoost.org.co/privkey.pem certFile /etc/letsencrypt/live/ajildoost.org.co/fullchain.pem map ajildoost ajildoost.org.co map astanehbadam astanehbadam.org.co, zagrev.astanehbadam.org.co, phone.astanehbadam.org.co map ntfy ntfy.uptimekuma.org.co map uptimekuma monitor.uptimekuma.org.co map samphone samphone.org.co, zagrev.samphone.org.co, phone.samphone.org.co map jellyfin.uptimekuma.org.co jellyfin.uptimekuma.org.co map trilium.uptimekuma.org.co trilium.uptimekuma.org.co map ocserv.uptimekuma.org.co ocserv.uptimekuma.org.co map seafile.uptimekuma.org.co seafile.uptimekuma.org.co map access access.uptimekuma.org.co map gilan-rice gilan-rice.org.co, zagrev.gilan-rice.org.co map gilan-rice gilan-rice.org.co, zagrev.gilan-rice.org.co map appended }
修正后的sed命令
sed -n '/listener SOCKS5{/,/}/{ /map/ { x /./p x h d } /}/ { x s/$/\n map new-entry new-domain.org.co/ p p d } p }' "$FILE"
修正逻辑
原命令的问题在于:所有map行会通过末尾的p被打印一次,同时存入hold空间;当遇到闭合}时,又会取出hold空间里的最后一条map行打印并修改,导致重复输出。
修正后的逻辑:
- 遇到map行时,先打印hold空间中存储的上一条map行(首次map行时hold空间为空,不会打印),再将当前map行存入hold空间,跳过默认打印
- 遇到
}时,取出最后一条map行,追加需要的内容后打印,再打印闭合的} - 非map、非
}的行直接正常打印
修正后输出示例
listener SOCKS5{ address *:4435 secure 1 keyFile /etc/letsencrypt/live/ajildoost.org.co/privkey.pem certFile /etc/letsencrypt/live/ajildoost.org.co/fullchain.pem map ajildoost ajildoost.org.co map astanehbadam astanehbadam.org.co, zagrev.astanehbadam.org.co, phone.astanehbadam.org.co map ntfy ntfy.uptimekuma.org.co map uptimekuma monitor.uptimekuma.org.co map samphone samphone.org.co, zagrev.samphone.org.co, phone.samphone.org.co map jellyfin.uptimekuma.org.co jellyfin.uptimekuma.org.co map trilium.uptimekuma.org.co trilium.uptimekuma.org.co map ocserv.uptimekuma.org.co ocserv.uptimekuma.org.co map seafile.uptimekuma.org.co seafile.uptimekuma.org.co map access access.uptimekuma.org.co map gilan-rice gilan-rice.org.co, zagrev.gilan-rice.org.co map new-entry new-domain.org.co } listener SOCKS4{ address *:80489 secure 0 map astanehbadam astanehbadam.org.co map ajildoost ajildoost.org.co map uptimekuma monitor.uptimekuma.org.co map ntfy ntfy.uptimekuma.org.co map samphone samphone.org.co, zagrev.samphone.org.co, phone.samphone.org.co map jellyfin.uptimekuma.org.co jellyfin.uptimekuma.org.co map trilium.uptimekuma.org.co trilium.uptimekuma.org.co map ocserv.uptimekuma.org.co ocserv.uptimekuma.org.co map seafile.uptimekuma.org.co seafile.uptimekuma.org.co map access access.uptimekuma.org.co map gilan-rice gilan-rice.org.co, zagrev.gilan-rice.org.co }
内容的提问来源于stack exchange,提问作者Fermichem
相关产品推荐
相关产品推荐

