如何替换另一个文件中的文本块

时间:2019-09-06 22:26:22

标签: bash awk sed replace

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

我要替换文件中的文本块,但要在定界符之后

<-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不是必需的,也许存在一种更好的方法来执行此操作 其实我有两个困难 1.我需要在包含<-FROM NEXT LINE->的行之后开始,并且需要在<-TO THE LINE ABOVE->上方的行停止 2. $live_data_list_file在sed阶段无法扩展,因此我无法从文件中获取数据。

您有更好的主意吗?

1 个答案:

答案 0 :(得分: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