我想扫描所有文件并替换所有实例。但是,当通过
从命令行输入读取$ 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"
有没有办法输入并让这个脚本运行而不必输入转义字符串?
答案 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将会很好地为你做这件事。