bash:带有转义斜杠的替换命令中的坏标志

时间:2017-04-19 05:38:10

标签: bash

我想扫描所有文件并替换所有实例。但是,当通过

从命令行输入读取$ my_var时

read -p ' Input React route ' my_var

我通过\/HomePage\/

它抛出:sed: 1: "s/<Route component={P ...": bad flag in substitute command: 'H'

完整的bash脚本:

read -p ' Input React route ' my_var
find . -maxdepth 1 -type f | xargs sed -i '' -e "s/<Route component={P} path=\"p.html\" routeName=\"p\" \/>/<Route component={L} path=\"$my_var\" routeName=\"L\" \/>/g"

有没有办法输入并让这个脚本运行而不必输入转义字符串?

3 个答案:

答案 0 :(得分:1)

read处理输入中的反斜杠转义 - \/在存储到/之前变为$my_var

您可以使用read -r来避免这种情况。

$ read my_var <<<'hello\/world'; echo "$my_var"
hello/world
$ read -r my_var <<<'hello\/world'; echo "$my_var"
hello\/world

如果组件中有斜杠,在sed中使用不同的分隔符可能会很有用,例如

sed -e "s:path=\"p.html\":path=\"$my_var\":g"
即使$my_var包含斜杠,

也会起作用,只要它不包含现在用作分隔符的字符:即可。您也可以在方便的时候选择其他角色。

答案 1 :(得分:0)

我相信你成了我所说的#34; bash-quoting-hell&#34;。

似乎你的/的转义在作为sed的参数传递之前被吃掉了。这些问题通常用于例如加倍反斜杠。

以下为我工作(在cygwin的bash中):

$ read -p ' Input React route ' my_var
 Input React route \\/HomePage\\/

$ echo "<Route component={P} path=\"p.html\" routeName=\"p\" />" \
> | sed -e "s/<Route component={P} path=\"p.html\" routeName=\"p\" \/>/<Route component={L} path=\"$my_var\" routeName=\"L\" \/>/g"
<Route component={L} path="/HomePage/" routeName="L" />

$

这不是很方便或用户友好(即使你自己是用户)。因此,我会添加一个预处理步骤:

$ read -p ' Input React route ' my_var
 Input React route /HomePage/

$ my_var=$(echo "$my_var" | sed -e 's/\//\\\//g')

$ echo "<Route component={P} path=\"p.html\" routeName=\"p\" />" \
> | sed -e "s/<Route component={P} path=\"p.html\" routeName=\"p\" \/>/<Route component={L} path=\"$my_var\" routeName=\"L\" \/>/g"
<Route component={L} path="/HomePage/" routeName="L" />

$

顺便说一下。还有另一种更简单的解决方案:sed s命令中的分隔符可能会被更改。 (我在以下示例中使用了#):

$ read -p ' Input React route ' my_var
 Input React route /HomePage/

$ echo "<Route component={P} path=\"p.html\" routeName=\"p\" />" \
> | sed -e "s#<Route component={P} path=\"p.html\" routeName=\"p\" \/>#<Route component={L} path=\"$my_var\" routeName=\"L\" \/>#g"
<Route component={L} path="/HomePage/" routeName="L" />

$

答案 2 :(得分:0)

尝试更改分隔符:

read -p ' Input React route ' my_var
my_var=$(echo ${my_var} | sed -e 's_#_\\#_g')
find . -maxdepth 1 -type f | xargs sed -i '' \
       -e 's#<Route component={P} path="p.html" routeName="p" />#<Route component={L} path="$my_var" routeName="L" />#g'

这里的诀窍是您可以将分隔符更改为您想要的任何内容。我也从使用shell中的双引号变为使用单引号。我认为现在让事情更具可读性了!

唯一的问题是你现在需要取消引用#字符,但是sed将会很好地为你做这件事。

相关问题