【问题标题】:How to find and replace the string with iterated values (multi lines) in shell script如何在shell脚本中用迭代值(多行)查找和替换字符串
【发布时间】:2016-11-25 19:36:45
【问题描述】:

这是我替换字符串的shell脚本

OPTIONS="-p ${PIDFILE}"

具有多行字符串值

OPTIONS_1234="-p ${PIDFILE_1234} -ORBEndpoint iiop://localhost:1234" OPTIONS_1235="-p ${PIDFILE_1235} -ORBEndpoint iiop://localhost:1235" OPTIONS_1236="-p ${PIDFILE_1236} -ORBEndpoint iiop://localhost:1236"

根据我输入的端口号,应该创建许多 OPTIONS。

#!/bin/bash    
NS_HOSTNAME= localhost
namingService_ports = 1234,1235,1236
IFS=','
read -r -a portArray <<< "$namingService_ports"

for port in ${portArray[@]}; do
        sed '0,/\PTIONS="-p ${PIDFILE}"/ s//\OPTIONS_'"$port"'="-p ${PIDFILE_'"$port"'} -ORBEndpoint iiop:\/\/'"$NS_HOSTNAME"':'"$port"'"\n  /' "/etc/init.d/tao" > "tao_ns1"
done

有人可以建议我 sed 命令如何将多行与 for 循环移动到文件“tao_ns1”

【问题讨论】:

  • 请多加注意您在问题上放置的标签。例如,为什么那里有“java”?!
  • 我误加了
  • 你在这里问过类似的问题,stackoverflow.com/questions/40790904/…
  • 就是这样,差别很小,这里发生的情况是这样的,虽然迭代第一个迭代值只是它的取值,我正在寻找完整的迭代数据应该在最终文件中可用
  • @PravinKmr:请参阅下面我的更新,一旦解决了您的问题,请不要忘记投票/接受答案

标签: linux sed


【解决方案1】:

你的脚本基本上有 3 个问题。

  1. bash 中的赋值 namingService_ports = 1234,1235,1236 不正确,应该没有空格,即 namingService_ports="1234,1235,1236"
  2. OPTIONS 的第一个 sed 选项中存在印刷错误,即 sed '0,/\PTIONS="-p ${PIDFILE}" 应该是 sed '0,/\OPTIONS="-p ${PIDFILE}"
  3. 在写入文件"tao_ns1" 时,您正在使用&gt; 运算符,它基本上在每次运行时都会覆盖文件。它应该是&gt;&gt; append 运算符,它为循环的每次迭代将新行附加到文件中。

还有http://www.shellcheck.net/,如果您的脚本中有回车符,请在继续下一步之前对其运行tr 命令。

tr -d '\r' < current_script.sh > new_script.sh

完成上述修复。

#!/bin/bash

NS_HOSTNAME="localhost"
namingService_ports="1234,1235,1236"
IFS=','
read -r -a portArray <<< "$namingService_ports"

for port in ${portArray[@]}; do
        sed '0,/\OPTIONS="-p ${PIDFILE}"/ s//\OPTIONS_'"$port"'="-p ${PIDFILE_'"$port"'} -ORBEndpoint iiop:\/\/'"$NS_HOSTNAME"':'"$port"'"\n  /' "/etc/init.d/tao" >> "tao_ns1"
done

应该可以正常工作。

【讨论】:

  • 这里 /etc/init.d/tao 文件我有 OPTIONS="-p ${PIDFILE} 并且我想用基于包含端口号计数的 portArray 的多行替换它并替换原来的一个
  • 输出应该是 OPTIONS_1234="-p ${PIDFILE_1234} -ORBEndpoint iiop://localhost:1234" OPTIONS_1235="-p ${PIDFILE_1235} -ORBEndpoint iiop://localhost:1235" OPTIONS_1236 ="-p ${PIDFILE_1236} -ORBEndpoint iiop://localhost:1236"
  • 但目前它正在将 /etc/init.d/tao 完整文件多次附加到具有选项的同一文件中
  • @PravinKmr:不要在 cmets 中复制粘贴代码块。你现在的要求是什么?只需将原始文件 "/etc/init.d/tao" 替换为 "tao_ns1" 即可?
  • @PravinKmr:我当前的脚本使用扩展选项创建了一个新文件"tao_ns1"?你想用init.d下的文件替换它吗?
【解决方案2】:

我希望能帮助你达到你想要的两个例子......

更改字符串并将结果重定向到新文件,将 AAA 替换为 BBB:

echo "xxxAAAxxx" | sed  "s/AAA/BBB/i" > out.ini

相同的逻辑(将 BBB 替换为 CCC),但此时替换现有文件中的某些字符串

sed  -i "s/BBB/CCC/i" out.ini

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 2012-11-02
    • 2014-06-06
    • 2012-06-07
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多