使用sed在文件指定字段后追加参数命令报错如何解决
问题原因
原sed命令无法正常执行、达不到预期,核心问题有3个:
- 分隔符冲突:sed的
s替换操作默认使用/作为命令分隔符,但你要追加的URL参数中包含大量/字符,sed会将URL内的斜杠误识别为命令分隔符,直接抛出语法错误。 - 追加位置错误:
s/$/追加内容/的写法是将内容加到整行的最末尾,但你需要的是把两个URL参数插在--activationkey="Dev Activation Key"之后、重定向符&> /var/log/subs2.log之前,直接追加到行尾会打乱命令参数顺序,导致重定向逻辑失效。 - 遗漏必要修改:对比预期结果,原命令没有处理行首需要加
sudo、原--org="Default_Organization"需要替换为--org="LDEdgeDevices"这两个变更。
可用修正命令
选择和待追加内容无冲突的|作为sed替换分隔符,避开斜杠冲突,同时精准匹配对应字段完成插入、替换操作:
sed -i ' # 替换行首内容,添加sudo前缀、修正org参数值 s|^subscription-manager register --org="Default_Organization"|sudo subscription-manager register --org="LDEdgeDevices"| # 匹配activationkey字段,在其后追加两个URL参数 s|\(--activationkey="Dev Activation Key"\) |\1 --serverurl=https://siedgeprodsatellitelb.siedgemanagement.com:8443/rhsm --baseurl=https://siedgeprodsatellitelb.siedgemanagement.com/pulp/repos | ' test
执行效果
命令执行完成后,文件内容和预期完全一致:
sudo subscription-manager register --org="LDEdgeDevices" --activationkey="Dev Activation Key" --serverurl=https://siedgeprodsatellitelb.siedgemanagement.com:8443/rhsm --baseurl=https://siedgeprodsatellitelb.siedgemanagement.com/pulp/repos &> /var/log/subs2.log
注:sed替换的分隔符可以自定义,只要选择的字符不出现在待匹配、待替换的内容中即可,除了
|之外,#、@等字符都可以作为分隔符使用。
内容的提问来源于stack exchange,提问作者pravin kumar
相关产品推荐
相关产品推荐

