Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Bash脚本查找/sed不工作_Regex_Bash - Fatal编程技术网

Regex Bash脚本查找/sed不工作

Regex Bash脚本查找/sed不工作,regex,bash,Regex,Bash,我的bash脚本中有以下行: find . -name "*.html" -print | xargs sed -i 's/http\:\/\/version2\.staging\.myname\.com//g' 它给了我以下的错误: sed: 1: "./instant/index. ...": invalid command code . 我要做的是替换出现的http://version2.staging.myname.com与/一起使用。你是怎么做的?通常我会使用以下方法: find

我的bash脚本中有以下行:

find . -name "*.html" -print |
xargs sed -i 's/http\:\/\/version2\.staging\.myname\.com//g'
它给了我以下的错误:

sed: 1: "./instant/index. ...": invalid command code .

我要做的是替换出现的
http://version2.staging.myname.com
/
一起使用。你是怎么做的?

通常我会使用以下方法:

find . -name "*.html" -exec sed -i 's|http://version2\.staging\.myname\.com/|/|g' '{}' ';'
要测试这一点,可以首先插入
echo
语句

find . -name "*.html" -exec echo sed -i 's|http://version2\.staging\.myname\.com/|/|g' '{}' ';'
。。。这将告诉您输出是否符合您的期望。我始终建议在任何大规模更新之前,先使用
echo
进行试运行。您还可以使用
|
作为备用正则表达式分隔符,以避免在路径中使用尽可能多的“/”。

对于OSX,请尝试以下方法:

find . -name "*.html" -exec sed -i.bak 's#http://version2\.staging\.myname\.com##g' '{}' \; -print

我想你可能正在使用Mac(现在我看到一条评论说你正在使用iMac)。在Mac OS X上,
sed-i
选项需要一个参数。这可以理解您的错误消息。
sed
命令将您的
s/..//g
命令解释为用于备份文件的后缀;然后它试图将第一个文件名解释为
sed
脚本,幸运的是,这不起作用

此外,通过使用
/
以外的字符作为
s//
的分隔符,可以避免大多数转义问题。此外,通常最好(尤其是在文件路径通常以空格结尾的Mac电脑上)避免使用
xargs
,并在
find
中使用
-exec
,同时使用
+
选项来执行
xargs
的功能,即将多个文件名分组到一个命令调用中

这导致:

find . -name "*.html" -type f \
    -exec sed -i .bak -e 's%http://version2.staging.myname.com%%g' {} +
(注意:严格来说,这将映射
http://version2-staging*myname@com
/
也一样;如果你真的担心这一点,一定要避开URL中的点。)

如果要在以后清除
.bak
文件:

find . -name '*.bak' -type f -exec rm -f {} +

默认情况下,xargs将尝试容纳尽可能多的文件,因此sed收到“s/…../g file1 file2 file3..filen”。然后,它尝试将除最后一个(filen)之外的所有内容解释为应该在
filen
上运行的命令。您可以将“-n1”添加到xargs调用中,这样它就只能逐个输出它们了?下面是echo语句的输出:sed-i s| \.staging\.myname\.com/|/| g./instant/index.html,但我仍然得到相同的错误。嗯,所以您不能在命令行上执行该行吗?这是linux还是其他版本的unix?我会先在一个文件上运行命令来验证sed语法。啊,这就是BSD。我需要检查sed期望的语法。您可以尝试
mansed
来删除.bak文件,我是否可以从上面的命令中删除.bak?您可以使用
-I'
而不是
-I.bak
,但我相信
.bak
是一个很好的特性,以防sed中出现问题。