在正则表达式中使用变量?

时间:2016-12-01 20:03:34

标签: bash sed

我正在创建的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

帮助!我确信解决方案很简单,但我觉得我已经尝试了所有的东西......

2 个答案:

答案 0 :(得分:1)

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

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

所以基本上你可以:

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

答案 1 :(得分:0)

此代码可以解决您的问题:

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

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