【问题标题】:Can't replace string to multi-lined string with sed无法使用 sed 将字符串替换为多行字符串
【发布时间】:2019-06-24 20:01:36
【问题描述】:

我正在尝试使用 sed 将文本中的固定解析(“replaceMe”)替换为多行文本。 我的 bash 脚本如下:

content=$(awk'{print $5}' < data.txt | sort | uniq)
target=$(cat install.sh)
text=$(sed "s/replaceMe/$content/" <<< "$target")
echo "${text}"

如果内容仅包含一行,则替换有效,但如果它包含 sevrel 行,我会得到:

sed:... untarminated `s' command

我阅读了有关“获取”多行内容的信息,但找不到有关放置多行字符串的信息

【问题讨论】:

  • sed 用换行符终止命令。 sed 不能可靠地使用多行。
  • awk'{print $5}' &lt; data.txt | sort | uniq - 您真的需要对该输入进行排序还是只是想获取唯一值但顺序无关紧要?
  • @EdMorton 订单无关紧要...我在某处读到您应该在“uniq”之前“排序”
  • 是的 uniq 仅适用于连续的相同值,例如您从排序输入中获得的值,但 sort | uniq 仅相当于 sort -u 并且您不需要获取唯一值当您使用 awk 时(例如,awk '!seen[$0]++' file 单独输出来自 file 的唯一值)这就是我问的原因。

标签: awk sed


【解决方案1】:

你会遇到更多的问题,这取决于data.txt 的内容,因为 sed 不理解文字字符串(请参阅Is it possible to escape regex metacharacters reliably with sed)。只需使用 awk 即可:

text="$( awk -v old='replaceMe' '
    NR==FNR {
        if ( !seen[$5]++ ) {
            new = (NR>1 ? new ORS : "") $5
        }
        next
    }
    s = index($0,old) { $0 = substr($0,1,s-1) new substr($0,s+length(old)) }
    { print }
' data.txt install.sh )"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    相关资源
    最近更新 更多