【发布时间】:2016-07-28 06:37:26
【问题描述】:
我需要用 bash 脚本中的文件中的另一个字符串替换具有空格的字符串,在该脚本中,所有调用都应通过将命令写入日志文件然后运行命令的函数来完成。 logrun 函数使用特殊字符$@ 来读取命令。我正在尝试使用 sed 进行替换,但是当表达式参数中包含空格的 sed 命令通过 $@ 时,我找不到转义空格的方法。
我已简化问题以测试我使用 sed 将 a c 替换为 a b c 的脚本。
test1.sh 效果很好:
#!/bin/bash
TESTFILE=/tmp/test.txt
echo "a c" > $TESTFILE
sed -i -e 's/a c/a b c/' $TESTFILE
test2.sh 失败:
#!/bin/bash
function logrun() {
CMD=$@
$CMD
}
TESTFILE=/tmp/test.txt
echo "a c" > $TESTFILE
logrun sed -i -e 's/a c/a b c/' $TESTFILE
结果:
sed: -e expression #1, char 3: unterminated `s' command
错误的原因是 -e 表达式中的空格。我还没有找到通过该函数调用 sed 的方法。我尝试使用双引号而不是单引号并用反斜杠等转义空格。我真的很想知道正确的方法是什么。
【问题讨论】:
-
@Barmar 您已经关闭了几个与stackoverflow.com/questions/13365553/… 重复的问题。找到一个更规范的副本会很好。这个问题有点难以解析,特别是对于那些询问
$@的人来说,在那篇文章中根本没有提到。 -
有一次你说过,自从被删除后,“注意:我不应该修改logrun函数。”那么修改函数可以吗?
-
@user3439894 不修改函数可以吗?我想知道这是否可能。
-
我不相信它可以按照你的方式完成,它需要修改才能工作。我问的原因是我想投票赞成约翰·库格曼的答案,因为它确实有效,而且是一个很好的答案。就是说,如果不允许函数修改,那么与该答案一样好,如果您的问题仍然受到您之前所做但已删除的陈述的限制,则它不会回答问题。