【发布时间】:2016-06-01 02:02:33
【问题描述】:
我将在实际提问之前介绍我的问题 - 请随意跳过本节!
关于我的设置的一些背景信息
为了在软件系统中手动更新文件,我正在创建一个 bash 脚本以使用 diff 删除新版本中不存在的所有文件:
for i in $(diff -r old new 2>/dev/null | grep "Only in old" | cut -d "/" -f 3- | sed "s/: /\//g"); do echo "rm -f $i" >> REMOVEOLDFILES.sh; done
这很好用。但是,显然我的文件的文件名中通常有一个美元符号 ($),这是由于 GWT 框架的一些排列。这是上面创建的 bash 脚本的一个示例行:
rm -f var/lib/tomcat7/webapps/ROOT/WEB-INF/classes/ExampleFile$3$1$1$1$2$1$1.class
执行此脚本不会删除想要的文件,因为 bash 将这些文件作为参数变量读取。因此,我必须用“\$”转义美元符号。
我的实际问题
我现在想在上述管道中添加一个 sed-Command,替换这个美元符号。事实上,sed 也将美元符号读取为正则表达式的特殊字符,所以显然我也必须将其转义。 但不知何故,这不起作用,在谷歌搜索后我找不到解释。
以下是我尝试过的一些变体:
echo "Bla$bla" | sed "s/\$/2/g" # Output: Bla2
echo "Bla$bla" | sed 's/$$/2/g' # Output: Bla
echo "Bla$bla" | sed 's/\\$/2/g' # Output: Bla
echo "Bla$bla" | sed 's/@"\$"/2/g' # Output: Bla
echo "Bla$bla" | sed 's/\\\$/2/g' # Output: Bla
此示例中所需的输出应为“Bla2bla”。 我错过了什么? 我正在使用 GNU sed 4.2.2
编辑
我刚刚意识到,上面的例子一开始是错误的 - echo 命令已经将 $ 解释为一个变量,而下面的 sed 无论如何都没有得到它......这里是一个正确的例子:
- 创建一个文本文件
test,内容为bla$bla -
cat test给bla$bla -
cat test | sed "s/$/2/g"给bla$bla2 -
cat test | sed "s/\$/2/g"给bla$bla2 -
cat test | sed "s/\\$/2/g"给bla2bla
因此,最后一个版本就是答案。记住:在测试的时候,首先要确保你的测试是正确的,然后再质疑测试对象......
【问题讨论】:
-
echo "Bla\\\$bla" | sed "s/\\\\\\$/2/g"。我想如果实际字符串包含$作为字符串文字的一部分,它会起作用。 -
不要使用
for遍历文件(或命令输出)。 mywiki.wooledge.org/BashFAQ/001 -
我对这个问题投了赞成票,因为它是如何提出一个好问题的一个很好的例子:展示努力、研究并解释具体问题如何适应总体目标。欢迎来到 Stack Overflow,船长。
-
@AnthonyGeoghegan 谢谢 :-)
-
@WiktorStribiżew 更改实际字符串是我的目标 - 不是解决方案...