【问题标题】:using variables in regex?在正则表达式中使用变量?
【发布时间】:2016-12-02 17:01:23
【问题描述】:

我正在创建的部分 shell 脚本采用纯文本文件列表...

 11111.jpg
 22222.jpg
 33333.jpg

...并附加一个存储在变量中的用户定义前缀,以创建如下所示的路径列表:

 user/defined/prefix/11111.jpg
 user/defined/prefix/22222.jpg
 user/defined/prefix/33333.jpg

我正在尝试使用 sed 以这种方式添加前缀:

 sed -e 's/^/prefix/' oldFile > newFile.new

变量被正确分配:

 echo $selectedPrefix
 user/defined/prefix

不要将单引号、双引号组合起来,以便 sed 使用变量的 ACTUAL 值,而不仅仅是变量名。

 sed -e 's/^/$selectedPrefix/' oldFile > newFile.new

产量:

 $selectedPrefix11111.jpg
 $selectedPrefix22222.jpg
 $selectedPrefix33333.jpg

帮助!我确信解决方案很简单,但我觉得我已经尝试了一切......

【问题讨论】:

  • 我建议使用双引号。
  • 谢谢大家!那么这基本上是一种情况,因为我的变量包含'/'我需要使用其他东西作为sed的分隔符?在这种情况下,我可以按照您的示例使用 '~' 或其他什么?
  • 您可以使用任何其他字符作为分隔符,例如|#@
  • 你可以试试 sed -e "s/^/${selectedPrefix//\//\/}/" oldFile > newFile.new。这样您就不必担心要使用什么其他分隔符了。

标签: bash sed


【解决方案1】:

正如 Cyrus 所提到的,如果您想要替换变量,则需要使用 "(双引号)而不是 '(单引号),因为单引号字符串是按字面解释的,因此它不会将 $selectedPrefix 视为变量,而是将$selectedPrefic 的字符串值,因此你看到了什么。

由于您在 sed 中使用路径,因此假设您应该为 sed 注释使用不同的分隔符是正确的。我通常更喜欢使用|,但~ 也可以。

所以基本上你可以拥有:

sed -e "s~^~$selectedPrefix~" oldFile > newFile.new

【讨论】:

  • 不幸的是,这个答案并不完全“安全”,因为如果“selectedPrefix”上的路径包含 sed 分隔符“~”,此代码将失败。因为我假设“selectedPrefix”可能会发生变化,所以无论“selectedPrefix”上的路径包括什么,只有像我在答案中所做的那样转义变量上的 sed 分隔符才会起作用。
  • 您是对的,与您建议的答案相比,它并非万无一失。我只是认为它使用起来可能看起来更友好,并且在大多数情况下都可以工作,但你是绝对正确的,它对于变量中包含的任何分隔符都会失败
  • 这很容易监督,我自己做了。有一次我记得我在代码中为 sed 使用了不同的分隔符,在晚上,当我已经在床上时,我突然想到(不知从何而来)这个异常可能会发生。我半夜下床换了密码。哈哈
【解决方案2】:

这段代码可以解决你的问题:

selectedPrefixEscaped="$(echo "$selectedPrefix" | sed 's/\//\\\//g')" && sed -e "s/^/$selectedPrefixEscaped/" oldFile > newFile.new

仅在 sed 上使用不同的分隔符会使您在(如果)路径包含新分隔符时遇到问题(例如:/folder/folder#5/file.txt 如果使用 # 作为 @ 会出现问题987654323@分隔符)。

【讨论】:

  • 可以简写为sed -e "s/^/${selectedPrefix//\//\/}/" oldFile > newFile.new
  • Alvits,我试过你的缩写,但它在我的电脑上不起作用。错误消息:sed: -e expression #1, char 10: `s' 的未知选项。
  • 您可能没有运行bash。我上面给出的语法只适用于bash
  • 我正在运行 bash(GNU bash,版本 4.3.30(1))。您是否知道扩展后的“$selectedPrefix”包含正斜杠(selectedPrefix=user/defined/prefix),在这种情况下也是 sed 的分隔符?用扩展试试你的代码,它不起作用(至少在这里它不起作用,我又试了一次)。
  • 您不能在同一行引用selectedPrefix 时设置它,因为shell 会扩展一个空表达式。当selectedPrefix 已设置时运行此行echo 11111.jpg | sed -e "s/^/${selectedPrefix//\//\/}/",将产生user/defined/prefix11111.jpg
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2017-10-11
  • 2013-06-27
  • 2019-11-08
相关资源
最近更新 更多