如何使用sed提取s_dest_address字段/后的值并移至行尾?
使用Sed提取并移动指定内容到行尾
针对你的需求——提取s_dest_address字段中/之后的值并移至行尾,这里有一个可行的Sed方案,我会详细拆解逻辑:
解决方案命令
首先,使用支持扩展正则表达式的Sed命令(兼容性更好,写法更简洁):
sed -E 's/(s_dest_address=[^\/]+)\/([^ ]+)(.*)/\1\3 \2/'
命令逻辑解释
我们把正则拆成三个捕获组,精准定位需要处理的内容:
(s_dest_address=[^\/]+):捕获s_dest_address=后面直到第一个/的所有内容(比如示例中的s_dest_address=10.55.28.125)\/([^ ]+):匹配/符号,然后捕获/之后到下一个空格前的内容(也就是你要提取的22)(.*):捕获该行剩余的所有内容
替换规则\1\3 \2的作用是:
- 保留第一组(处理后的
s_dest_address字段)和第三组(剩余内容)的原有顺序 - 在最后拼接空格和第二组(提取出的目标值)
测试示例
输入字符串:
s_check_login_password= s_comm_type=TCPIP s_dest_address=10.55.28.125/22 s_org_address= s_net_proxy= s_ft_proxy=
执行命令后输出:
s_check_login_password= s_comm_type=TCPIP s_dest_address=10.55.28.125 s_org_address= s_net_proxy= s_ft_proxy= 22
可选优化:给移动的内容添加字段名
如果你希望移到末尾的内容带上明确的字段标识(比如s_port=),可以修改命令为:
sed -E 's/(s_dest_address=[^\/]+)\/([^ ]+)(.*)/\1\3 s_port=\2/'
输出会变成:
s_check_login_password= s_comm_type=TCPIP s_dest_address=10.55.28.125 s_org_address= s_net_proxy= s_ft_proxy= s_port=22
为什么你的原命令不可行?
你之前尝试的sed 's/\([^/]*[^ s_]* s_\)\(.*;\)/\2\1/'逻辑和需求完全不匹配:
- 正则试图匹配非
/、非s_的内容再拼接s_,然后把后面内容移到前面,根本没有定位到/后的目标值,自然无法实现你想要的效果。
内容的提问来源于stack exchange,提问作者f1rstsurf
相关产品推荐
相关产品推荐

