Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Macos 当不支持-i参数时,如何使用grep和sed替换多个文件中的字符串?_Macos_Unix_Sed_Grep - Fatal编程技术网

Macos 当不支持-i参数时,如何使用grep和sed替换多个文件中的字符串?

Macos 当不支持-i参数时,如何使用grep和sed替换多个文件中的字符串?,macos,unix,sed,grep,Macos,Unix,Sed,Grep,我试过这个命令 grep '/static' dir/* | xargs sed -i 's/\/static//g' 但是我使用的sed版本不支持-I论点 要将文件中的字符串替换为与输出相同的输入文件,我通常会执行以下操作: sed 's/\/static//g' filename.txt > new_filename.txt ; mv new_filename.txt filename.txt 使用perl: $ perl -pi.bak -e 's@/static@@g' dir

我试过这个命令

grep '/static' dir/* | xargs sed -i 's/\/static//g'
但是我使用的sed版本不支持-I论点

要将文件中的字符串替换为与输出相同的输入文件,我通常会执行以下操作:

sed 's/\/static//g' filename.txt > new_filename.txt ; mv new_filename.txt filename.txt
使用perl:

$ perl -pi.bak -e 's@/static@@g' dir/*

可以使用循环执行此操作:

for file in $(grep -l '/static' dir/*) ; do
    sed 's/\/static//g' $file > $file.$$ && mv $file.$$ $file
done
我使用
$$
后缀(
$$
是当前shell的进程id)来避免与现有文件名冲突,并且使用
&&
而不是
以避免在
sed
命令因某种原因失败时重击输入文件。我还添加了
-l
,以便grep打印文件名而不是匹配行


或者您可以安装GNU sed(我不确定在OSX上如何安装)。

OSX版本的
sed
确实支持
-I
,但它需要一个参数来告诉它备份文件要使用什么文件扩展名(或者
不备份)。顺便说一句,您希望
grep-l
只获取文件名

grep -l '/static' dir/* | xargs sed -i "" 's/\/static//g'

我希望能用grep和sed找到答案,因为我对perl一窍不通。感谢您的回复。在这个有限的场景中,Perl与
sed
非常相似。您可以使用
s2p
工具将简单的
sed
脚本转换为Perl。难道
grep
命令不应该打印文件名而不是带有匹配项的行吗,比如
$(grep--files with matches'/static'dir/*)
?@Birei:完全正确(我从问题中复制了grep命令,应该仔细检查)。答案已更新。感谢提供有关使用的提示。$$。这是完美的作品,经过进一步阅读,我完全理解它。可耻的是,我没有办法使用简单的一行代码。@DaveCastillo:好吧,你可以写在一行(很长)上,或者你可以把命令放在shell脚本中。@KeithThompson我的意思是,这和我上面描述的一行代码(带-I参数的那一行)是一样的。它成功了!我没有为备份文件提供扩展名。把它放在那里就行了。这肯定比通过for循环更容易记住。谢谢