2017-04-19 93 views
0

我想扫描所有文件并替换所有实例。然而,当$ my_var从命令行输入通过bash:替换命令中带有斜杠的坏标记

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" 

是有一种方法可以输入并让脚本运行而不必输入转义字符串?

+0

向我们展示您的实际文件和要替换的模式,而不是您尝试和失败的方式 – Inian

回答

0

我相信你成了我称之为“bash-quoting-hell”的受害者。

看起来您的转义/在它作为参数传递给sed之前已被吃掉。这些问题通常由例如加倍反斜杠。

以下为我工作(在bash在Cygwin上):

$ 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" /> 

$ 

Btw。还有另外一个更简单的解决方案:可以更改sed s s命令中的分隔符。 (I下面的示例中使用#):

$ 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" /> 

$ 
0

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包含一个斜杠,只要它不包含现在正被用作分隔符的字符:。您可以方便地选择其他角色。

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会为你做的很好。