如何替换特殊字符,然后将其存储到shell变量中?

时间:2013-11-21 00:01:14

标签: shell unix emacs

我正在做一些脚本shell工作,我不完全确定我做错了什么。代码

#!/bin/bash

IFS='
'
sed s/"$1"/"$2"/g "$3" > "$3.updated"
mv "$3.updated" $3

是一个名为“sub1”的shell脚本。 Sub1传递三个变量;要替换的字符串($ 1),替换它的字符串($ 2)和文件名($ 3)。我试图修改上面的代码,以便如果要替换的字符是“特殊字符”,(如*或/或。),我可以将其替换为“安全”版本(即如果字符为“*”)是一个*)

我的代码如下。

#!/bin/sh
IFS='
'

"$1" = $target
sed 's/*//*/g' "$target" > "$newtarget"
"$1" ="$newtarget"
sed s/"$1"/"$2"/g "$3" > "$3.updated"
mv "$3.updated" $3

但是,当输入以下命令来测试我的代码(./sub2 * x testcase2)时,testcase2只包含文本“test * test”,我得到以下错误。

 ./sub2: 5: ./sub2: 252225688.dat: not found
 ./sub2: 6: ./sub2: cannot create : Directory nonexistent
 ./sub2: 7: ./sub2: 25225688.dat: not found

我对这些错误背后的原因感到非常困惑;我的代码中没有调用252225788.dat(尽管它与我的sub2脚本位于同一目录中),所以我不知道为什么这甚至会成为一个问题。我用emacs打开了252225788以查看它包含的内容,它只是文本“%%%%%%%%”。关于我应该在这里做什么,我感到非常困惑。起初我以为这只是我的语法,但与252225688的整个交易让我彻底抛弃了。

编辑: 我要做的是$ 1参数中可能包含许多“不安全”字符(即[,],。,,)。参数可以是“”,它可以是“L *”,也可以是“w \ o \ r \ d \”。我被告知我应该将目标字符串($ 1参数)放入shell变量,$ target就像我一样,然后使用sed命令将这些字符([,],^,,那些)重写为通过在前面添加反斜杠或通过[]包围它们的安全版本。然后我会将该字符串的重写版本存储到另一个shell变量($ newtarget)中。我假设我会用我的“sed's /”“/”/ *“/ g'”交易进行实际替换(sed,重写shell变量),但显然这不是正确的方法关于它。

1 个答案:

答案 0 :(得分:0)

shell将

*扩展到当前目录中的文件列表,这称为glob expansion或globbing。尝试

$ echo *
> file1
> file2
...

如果你想回复*,你需要逃避它

$ echo \*
> *

或将其放在引号

$ echo "*"
> *
$ echo '*'
> *

另一种选择是关闭全局扩展

$ set -f
$ echo *
> *

但不太可能你想要那样,因为全球扩张是一件好事。

因此,如果您想将*作为字符传递给您的脚本,请将其转义或在其周围加上引号。