linux - 在 RHEL6.7 上用 sed 替换 sed

标签 linux bash shell sed rhel6

我正在尝试用 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/

相关文章:

shell - nohup - 权限被拒绝

sql - 将 SQL 结果传递到 shell 脚本中的数组时标识符无效

linux - root 用户的 Chef 客户端权限被拒绝

bash - 如何找到传递给 Bash 脚本的参数数量?

linux - 如何在接收参数的shell脚本中创建一个函数?

linux - 在 ksh 中拆分字符串

linux - 按内存使用情况对进程进行排序

linux - .htaccess 将 index.php 重定向到/

Bash:大括号扩展优先级和范围循环

Git 文件重命名产生错误 : "warning: destination exists; will overwrite!"