【问题标题】:How can I replace a block of text inside another file如何替换另一个文件中的文本块
【发布时间】:2020-01-09 18:04:23
【问题描述】:

我编辑了帖子并听从了您的建议,我将我的工作分成了更多文件。

我想替换文件中的文本块,但在分隔符之后

<-FROM NEXT LINE->
code to be replaced
code to be replaced
code to be replaced
<-TO THE LINE ABOVE->

因为我收集网上数据,每次数据都不一样,所以要替换的代码也不一样。

这是脚本的一部分:

#!/bin/bash

set -x

########## CONFIGURATIONS ##########
live_data_url='https://www.somedata.com/api/url'

live_data_list_file=~/jjjjjjjj
file_to_modify=~/kkkkkkk
########## CONFIGURATIONS ##########


########## FUNCTIONS ##########
function upgrade() {
    echo "Downloading/Upgrading traker data ..."

    wget -O $live_data_list_file $live_data_url
    if [[ $? -ne 0 ]]; then
        echo "I can't download the data, I'll use a static one"
        exit 9
    fi

    echo "Downloading/Upgrading done."
}
########## FUNCTIONS ##########

upgrade

sed -i -ne '/STARTINGPOINT+1LINE/ {p; r $live_data_list_file' -e ':a; n; /ENDINGPOINT-1LINE/ {p; b}; ba}; p' $file_to_modify

目标是升级$file_to_modify部分内的块:

<-FROM NEXT LINE->
code to be replaced
code to be replaced
code to be replaced
<-TO THE LINE ABOVE->

所以我搜索了一下,我找到了一个很好的起点,但我不知道如何修改它。不是使用 sed 的必要条件,也许存在更好的方法来做到这一点 其实我有2个难度 1.我需要在包含&lt;-FROM NEXT LINE-&gt;的行之后开始,我需要停止&lt;-TO THE LINE ABOVE-&gt;以上的行 2.$live_data_list_file在sed阶段的扩展不起作用,所以无法从文件中取数据。

你有更好的主意吗?

【问题讨论】:

  • 我没有看到任何其他恶意用例。如果您真的打算将其用于应用程序开发,则需要找到一种方法来分离代码和数据。例如json 是一种轻量级的数据交换格式。
  • 我能理解风险。但是我问一个更有能力的人:即使在脚本退出之前的最后调用它也这么糟糕吗?
  • edit 你的问题,所以你想要做什么的描述(从“”修改为“”)与示例输入相匹配您提供(目前不包含这两行)并在给定示例输入的情况下发布确切的预期输出。

标签: bash awk sed replace


【解决方案1】:

不要将数据存储在脚本中,而是保留实时数据文件。也就是说,将数据下载到$live_data_list_file,让 wget 下载到临时文件,如果 wget 成功,则将临时文件复制到实时数据文件上。此外,您不要在其他地方编辑该文件 - 它必须保持原始状态,以防 wget 失败。

大概是这样的:

function upgrade() {
    echo "Downloading/Upgrading tracker data ..."

    # grab the current data into a temporary file
    wget -O ${live_data_list_file}.temp $live_data_url
    if [[ $? -ne 0 ]]; then
        echo "I can't download the data, I'll use the last one"
    else
        # succeeded, so the temp file is our real file.
        mv ${live_data_list_file}.temp ${live_data_list_file}
    fi

    echo "Downloading/Upgrading done."
}

upgrade()

# don't modify ${live_data_list_file} in the rest of your code - use another temporary file if you need to modify it.
# and just use ${live_data_list_file}, not the data "inside" your code

【讨论】:

  • 感谢您的回复,'$live_data_list_file' 已经是一个人了,并且每天都在升级,我的想法是,如果脚本像往常一样工作,就在退出之前,用新数据更新脚本.这是一个坏主意吗?如果我理解,您的想法是创建第三个文件以使用此文件?如果 wget 在第一次启动时不起作用怎么办?
  • @JormanFranzini - 是的,创建一个额外的。如果 wget 在您的第一次启动时不能按原样工作怎么办?您今天使用的静态数据,只需将其用作实时数据的第一个种子。 (更新示例)
  • 谢谢,我编辑了原始问题。就像大家说的,修改一个 runnins 脚本不是很好,所以我创建了一个额外的脚本来修改主脚本。您对如何替换分隔范围内的所有文本有一些想法吗?
猜你喜欢
  • 2019-03-06
  • 2018-03-29
  • 2021-08-29
  • 2011-02-11
  • 2021-09-18
  • 2018-12-27
  • 1970-01-01
  • 2013-05-19
  • 2014-03-05
相关资源
最近更新 更多