gpt4 book ai didi

regex - 在 sed 的正则表达式中转义美元符号

转载 作者:行者123 更新时间:2023-11-29 08:55:07 25 4
gpt4 key购买 nike

我会在实际提问之前介绍我的问题是什么 - 请随意跳过这一部分!

关于我的设置的一些背景信息

为了在软件系统中手动更新文件,我创建了一个 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 无论如何都没有得到它......这里是一个正确的例子:

  1. 创建一个文本文件test,内容为bla$bla
  2. cat test 给出 bla$bla
  3. 猫测试 | sed "s/$/2/g" 给出 bla$bla2
  4. 猫测试 | sed "s/\$/2/g" 给出 bla$bla2
  5. 猫测试 | sed "s/\\$/2/g" 给出 bla2bla

因此,最后一个版本就是答案。记住:在测试时,首先要确保你的测试是正确的,然后再质疑测试对象......

最佳答案

在 sed 的正则表达式中转义美元符号的正确方法是双反斜杠。然后,为了在输出中创建转义版本,我们需要一些额外的斜线:

cat filenames.txt | sed "s/\\$/\\\\$/g" > escaped-filenames.txt

是的,这是连续的四个反斜杠。这会创建所需的更改:像 bla$1$2.class 这样的文件名将更改为 bla\$1\$2.class。然后我可以将其插入到完整的管道中:

for i in $(diff -r old new 2>/dev/null | grep "Only in old" | cut -d "/" -f 3- | sed "s/: /\//g" | sed "s/\\$/\\\\$/g"; do echo "rm -f $i" >> REMOVEOLDFILES.sh; done

解决背景问题的替代方案

chepner 发布了解决后台问题的替代方法,只需在输出的文件名周围添加单引号。这样,在执行脚本时 $ 符号不会被 bash 读取为变量,并且文件也会被正确删除:

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

(注意该行中已更改的 echo "rm -f '$i'")

关于regex - 在 sed 的正则表达式中转义美元符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35506303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com