【问题标题】:Bash script using sed to replace string with given UNIX system path使用 sed 将字符串替换为给定 UNIX 系统路径的 Bash 脚本
【发布时间】:2015-04-10 20:27:36
【问题描述】:

我有以下名为 SetScript 的 bash 脚本:

#!/bin/bash

# make sure CWD is correct location
if [ ! -f $1 ];
then
    echo "No file at \"$1\" found."
    exit 0
fi

sed -i -r "s/^([\t ]+SCRIPT = \")[^\"]*\";\ #\*/\1$2\";\ #\*/" $1

此脚本用于在文本文件中更改如下行:

    SCRIPT = "default.script"; #*

文本文件只是我与 libconfig++ 库一起使用的配置文本文件。

因此,例如,如果我的配置文本文件名为 settings.cfg,那么我可能会这样做

SetScript settings.cfg another.script

甚至这个

SetScript settings.cfg "another.script"

这些命令将导致上面的文本文件行更改为:

    SCRIPT = "another.script"; #*

到目前为止一切顺利。但是,当我尝试用包含正斜杠的 UNIX 路径替换时,我遇到了 sed 的问题。例如:

$ SetScript settings.cfg "/home/me/some.script"
sed: -e expression #1, char 38: unknown option to `s'
$ SetScript settings.cfg /home/me/some.script
sed: -e expression #1, char 38: unknown option to `s'

然后,我的问题是:如何修改我的 bash 脚本(同时仍使用 sed)以允许替换为任何 UNIX 系统路径(相对或完整)?

【问题讨论】:

  • 您可以将 sed 分隔符更改为不会出现在文件名中的内容。所以像sed -i -r "s|^([\t ]+SCRIPT = \")[^\"]*\";\ #\*|\1$2\";\ #\*|" $1 这样的东西会起作用。

标签: regex bash unix sed


【解决方案1】:

这是因为您使用的sed 分隔符也是/,所以sed 命令看到这么多斜线时会感到困惑。

尝试设置另一个分隔符,例如_:

sed -i -r "s_^([\t ]+SCRIPT = \")[^\"]*\";\ #\*_\1$2\";\ #\*_" $1
            ^                                  ^            ^

示例

$ echo "he/llo" | sed 's/he/bye/'
byello
$ echo "he/llo" | sed 's/he/llo/bye/'
sed: -e expression #1, char 10: unknown option to `s'
$ echo "he/llo" | sed 's_he/llo_bye_'
bye

【讨论】:

  • 谢谢。我没有意识到您可以在 sed 表达式中使用任意分隔符。但是,如果路径中恰好有下划线,在进行建议的修改后,我会遇到类似的问题。对吗?
  • 是的,那么您可以使用例如|,它不是url-valid。
  • 啊!好主意。谢谢:)
猜你喜欢
  • 2022-07-21
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
相关资源
最近更新 更多