【问题标题】:Find and replace variables containing non-escaped characters with sed使用 sed 查找并替换包含非转义字符的变量
【发布时间】:2012-02-14 20:25:20
【问题描述】:

我可以使用它来查找“fly”的所有实例并在我的文件中将其替换为“insect”:

sed -i 's/fly/insect/g' ./animals.txt

如何找到一个 BASH 变量并将其替换为另一个 BASH 变量?例如:

name=$(echo "fly")
category=$(echo "insect")
sed -i 's/$name/$category/g' ./animals.txt

更新:

我使用的是 GNU sed 版本 4.2.1。当我尝试以下解决方案时,它会报告此错误:

sed: -e expression #1, char 73: unknown option to `s'

更新:

我发现了错误出现的原因。 $category 经常包含很多符号(例如“/”、“$”、“@”、“!”、括号等)。

ame=$(echo "fly")
category=$(echo "in/sect")
sed -i "s/$name/$category/g" ./animals.txt

上面的代码会产生同样的错误:

sed: -e expression #1, char 7: unknown option to `s'

有没有办法让sed 完成替换,即使遇到这些符号?

【问题讨论】:

  • 为什么是name=$(echo "fly") 而不仅仅是name=fly?还是name="because it has spaces"
  • 我试图提供一个简单的例子,因为解释所有其他例子太难了。简单的例子和​​我的完整代码有同样的问题,即:name=$(echo $entry | awk -F ",*" '{print $3}')category=$(echo "\mymacro{"$name"}{"$description"}{"$details"}")

标签: bash sed replace


【解决方案1】:

使用双引号

使用双引号使shell扩展变量同时保留空格:

sed -i "s/$name/$category/g" ./animals.txt

注意:如果您需要在替换中添加反斜杠(例如用于反向引用),则需要双斜杠(\& 包含模式匹配):

使用单引号

如果你有很多 shell 元字符,你可以这样做:

sed -i 's/'$pattern'/'$category'/g' ./animals.txt

我发现了错误出现的原因。 $category 经常包含很多符号(例如“/”、“$”、“@”、“!”、括号等)。

如果替换或替换部分包含像/ 这样的字符,那么我们可以使用不同的sed 分隔符集。您可以使用类似 - @ % , ; : | _ 等的任何字符,这些字符不会在您的替换和替换中出现。

【讨论】:

  • 使用这两种方法,它都会打印以下错误:“sed: -e expression #1, char 85: unknown option to `s'”。
  • 看起来您正在使用 sed 的 BSD (Mac) 版本。在-i 选项旁边加上引号。例如sed -i'' 's/... 如果您使用的是solaris box,那么-i 选项将不起作用。 Solaris sed 不支持它。
  • 或者如果在 mac 上给出一个备份文件名。 sed -ibak 's/...
  • 我在 Linux 上安装了 GNU sed 4.2.1 版。
  • 我不太确定,我在 GNU-SED 上对它们都进行了测试,它们工作正常。您是否也收到其他答案的错误?
【解决方案2】:

使用双引号,以便 shell 插入您的变量:

sed -i "s/$name/$category/g" ./animals.txt

【讨论】:

  • 这会返回错误:“sed: -e expression #1, char 73: unknown option to `s'”。
【解决方案3】:

使用双引号:

sed -i "s/$name/$category/g" ./animals.txt

【讨论】:

  • 请注意,这只适用于简单的字符串。例如,要替换包含文字 *./ 或其他特殊字符的任何内容,您将需要更复杂的解决方案。
猜你喜欢
  • 2023-01-24
  • 1970-01-01
  • 2016-09-05
  • 2014-10-08
  • 2021-12-18
  • 2014-10-28
  • 2016-06-13
  • 1970-01-01
  • 2014-09-05
相关资源
最近更新 更多