【问题标题】:shell bash, cat file whilst using sed to replace textshell bash,cat文件同时使用sed替换文本
【发布时间】:2014-02-09 19:30:09
【问题描述】:

在 SO 的帮助下,我能够更正我的 sed 命令,以便我可以使用变量(使用 ' 而不是 " 并且没有使用 g 表示全局)。

但是,我正在努力让命令正常工作。

为了给你一些背景信息,我有一个包含多行文本的文件,有些行包含一个或多个标签。这些标签的格式如下:

[#$key#] - i.e #[#] is used to indicate the presence of a key

然后我有一个内部数组对象,它存储一个字符串值,其中包含以下格式的每个键和一个对应的值:

$key=$value

我要做的是在使用全局 sed 替换将 $key 交换为数组对象中的相应值的同时对包含标签的文件进行分类。

我遇到的问题是我的 grep/sed 命令没有替换任何文本,我不知道为什么。

这是我的代码:

for x in "${prop[@]}"
do
     key=`echo "${x}" | cut -d '=' -f 1`
     value=`echo "${x}" | cut -d '=' -f 2`


    # global replace on the $MY_FILE
    cat $MY_FILE | sed "s|\[#${key}#\]|${value}|g" > ${TEMP_MY_FILE}
    cat $TEMP_MY_FILE > $MY_FILE

 done

我想过用sed -i,但是我的版本好像不支持-i

【问题讨论】:

  • 不需要cat file | sed > new_file。相反,请执行sed ... file > new_file
  • 您似乎对设置keyvalue 的行也有问题,我认为这会导致一些错误。
  • 键和值变量与预期一致 - 已回显它们以进行仔细检查
  • 在脚本开头使用set -x 并以这种方式进行调试
  • 为了将来参考,sed -i ... inputfile 只是sed ... inputfile > tmpfile; mv tmpfile inputfile 的快捷方式。它只是让你不必明确地声明它......

标签: string shell sed grep cat


【解决方案1】:

虽然 [ 在双引号 bash 字符串中没有任何特殊含义,但 \[ 仍然计算为 [,因为处理反斜杠以允许转义美元符号。试试

sed "s|\\[#${key}#\\]|${value}|g"

作为您的sed 命令。双反斜杠会导致将文字反斜杠发送到sed,后者将使用它来转义[,以便将其按字面意思处理。

【讨论】:

  • 我的版本(在 solaris 上)不支持 -i 恐怕
  • 当我在脚本上使用 set -xv 时,它似乎将 grep 中的 $key 字符串解释为 [\#\e\x\a\m\p\l\e_\ k\e\y\#] 而不是 [#example_key#]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 2022-10-21
  • 2021-03-21
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多