【问题标题】:Use sed with variable that contains dot [duplicate]将 sed 与包含点的变量一起使用 [重复]
【发布时间】:2017-02-01 06:22:12
【问题描述】:

我正在尝试将文件中的(例如)6.0 替换为 6.1,但没有将 640 替换为 6.1

我目前有:

sed -i "s/$previousName/$newName/" 'myFile'

我认为解决方案可能在here,但我没有找到合适的解决方案。

EDIT 两个字符串都在一个变量中,并且这应该是重复的问题不处理这种情况

【问题讨论】:

  • 好的,我阅读了你的链接,发现sed -e 's/[]\/$*.^|[]/\\&/g' 这是什么,它有什么作用,我应该在哪里设置我的变量?

标签: bash shell sed


【解决方案1】:

试试这个:

sed -i "s/6\.0/6.1/" 'myFile'

关键是将模式中具有特殊含义的.字符转义。默认匹配任何字符(包括640中的0),而前面有\,它只匹配文字.

因为你有一个变量中的模式,你可以像这样首先转义其中的.

previousNameE="$(sed -e 's/\./\\./' <<< "$previousName")"
sed -i "s/$previousNameE/$newName/" 'myFile'

【讨论】:

  • 好的,但是内容在变量里面,所以我不能手动转义。
  • @Sharcoux 我更新了我的答案。
  • 抱歉,我认为 Leif Ericson 解决方案在几秒钟前就出现了,我喜欢一个班轮,但谢谢。
【解决方案2】:

如果perl 可以接受:

perl -i -pe "s/\Q$previousName/$newName/" 'myFile'

来自perldoc\Q

返回带有所有 ASCII 非“单词”字符的 EXPR 的值 反斜杠。 (即所有 ASCII 字符不匹配 /[A-Za-z_0-9]/ 将在返回的字符串中以反斜杠开头, 无论任何区域设置如何。)这是内部功能 在双引号字符串中实现 \Q 转义

另一个例子:

$ echo '*.^[}' | perl -pe 's/\Q*.^[}/q($abc$)/e'
$abc$

延伸阅读: Perl flags -pe, -pi, -p, -w, -d, -i, -t?

【讨论】:

  • 酷! Q 是干什么用的?我可以搜索自己,但我想到了潜在的未来读者
  • 无法打开 perl 脚本“s/\Q1.6.0/1.6.1/”:没有此类文件夹或文件
  • type perl 返回什么?这打印你好吗? perl -e 'print "Hello\n"'
  • 我想现在可以了,谢谢。我会记住这个解决方案。似乎比 sed 容易。您介意在您的答案中添加指向this 的链接,或者对 i 和 pe 进行解释吗?
  • 谢谢,链接比添加我自己的解释更容易。perl -i -pe 简单来说相当于sed -i
【解决方案3】:

使用内部sed

sed -i "s@$(echo $previousName | sed 's/\./\\./g')@$newName@g" myFile

【讨论】:

  • 为什么不呢。让我们试试这个
  • 似乎工作正常。谢谢!
猜你喜欢
  • 2014-04-19
  • 2018-11-18
  • 1970-01-01
  • 2022-01-26
  • 2020-10-03
  • 2020-09-25
  • 2013-02-08
  • 1970-01-01
  • 2015-10-01
相关资源
最近更新 更多