我正在尝试用 sed 命令替换 sed 命令,但它一直失败,所以在“栅栏围栏”几个小时后,我想我应该在这里问这个问题。
我有各种包含这种行的 bash 脚本:
sed 's/a hard coded server name servername.//'
我想将其替换为:
sed "s/a hard coded server name $(hostname).//"
请注意添加双引号以便扩展 $(hostname),这比我预期的要复杂一些。
所以这是我多次失败尝试中的第一次:
cat file | sed 's!sed \'s\/a hard coded server name servername.\/\/\'!sed \"s\/a hard coded server name $(hostname).\/\/\"!g'
我还尝试使用 sed 的“-e”选项将替换分解成多个部分,以尝试定位问题区域。我不会在解决方案中使用“-e”开关,但它有时对调试很有用:
cat file | sed -e 's!servername!\$\(hostname\)!' -e 's!\| sed \'s!\| sed \"s!'
第一个 sed 按预期工作(这里没有什么特别的事情发生),第二个失败,所以没有必要添加第三个,它必须替换结束双引号。
在这一点上,我的历史陷入困惑,所以没有必要再添加任何失败的尝试。
我想在单个命令中使用第一个替换,因为脚本中充满了 sed 命令,而我只想针对脚本中的一个特定命令。
如有任何想法,我们将不胜感激。
最佳答案
如果像使用 sed 一样忽略(或处理)旧文本和新文本中的元字符,您可以在 awk 中执行此操作:
$ awk -v old="sed 's/a hard coded server name servername.//'" \
-v new="sed 's/a hard coded server name '\"\$(hostname)\"'.//' \
'{sub(old,new)}1' file
sed 's/a hard coded server name '"$(hostname)"'.//'
或者为了避免处理元字符,只使用字符串进行比较和替换:
$ awk -v old="sed 's/a hard coded server name servername.//'" \
-v new="sed 's/a hard coded server name '\"\$(hostname)\"'.//'" \
's=index($0,old){$0=substr($0,1,s-1) new substr($0,s+length(old))}1' file
sed 's/a hard coded server name '"$(hostname)"'.//'
关于linux - 在 RHEL6.7 上用 sed 替换 sed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36334968/