Ted*_*edd 642 bash awk replace sed
如何找到并替换每次出现的事件:
subdomainA.example.com
Run Code Online (Sandbox Code Playgroud)
同
subdomainB.example.com
Run Code Online (Sandbox Code Playgroud)
在/home/www/
目录树下的每个文本文件递归?
Nik*_*hev 817
注意:不要在包含git repo的文件夹上运行此命令 - 更改为.git可能会损坏您的git索引.
find /home/www \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'
Run Code Online (Sandbox Code Playgroud)
来自-print0
:
-print0 (仅限GNU查找)告诉find使用空字符(\ 0)而不是空格作为找到的路径名之间的输出分隔符.如果文件可以包含空格或其他特殊字符,则这是一个更安全的选项.建议使用-print0参数来查找是否使用-exec命令或xargs(xargs中需要-0参数.).
Joh*_*nck 242
注意:不要在包含git repo的文件夹上运行此命令 - 更改为.git可能会损坏您的git索引.
find /home/www/ -type f -exec \
sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +
Run Code Online (Sandbox Code Playgroud)
与此处的其他答案相比,这比大多数答案更简单,并使用sed而不是perl,这是原始问题所要求的.
Ana*_*oly 173
对我来说最简单的方法是
grep -rl oldtext . | xargs sed -i 's/oldtext/newtext/g'
Run Code Online (Sandbox Code Playgroud)
I15*_*159 59
所有技巧几乎相同,但我喜欢这个:
find <mydir> -type f -exec sed -i 's/<string1>/<string2>/g' {} +
Run Code Online (Sandbox Code Playgroud)
find <mydir>
:在目录中查找.
-type f
:
文件类型为:常规文件
-exec command {} +
:
-exec操作的此变体在所选文件上运行指定的命令,但命令行是通过在末尾附加每个选定的文件名来构建的; 命令的调用总数将远远少于匹配文件的数量.命令行的构建方式与xargs构建命令行的方式大致相同.命令中只允许一个"{}"实例.该命令在起始目录中执行.
Emp*_*ian 39
cd /home/www && find . -type f -print0 |
xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g'
Run Code Online (Sandbox Code Playgroud)
Rob*_*ujo 30
对我来说,最简单的解决方案是/sf/answers/147925711/,即:
sed -i '' -e 's/subdomainA/subdomainB/g' $(find /home/www/ -type f)
Run Code Online (Sandbox Code Playgroud)
注意:-i ''
解决OSX问题sed: 1: "...": invalid command code .
注意:如果要处理的文件太多,您将获得Argument list too long
.解决方法 - 使用find -exec
或xargs
解决方案如上所述.
Jac*_*ang 26
任何人使用银色搜索者(ag
)
ag SearchString -l0 | xargs -0 sed -i 's/SearchString/Replacement/g'
Run Code Online (Sandbox Code Playgroud)
由于ag默认忽略git/hg/svn文件/文件夹,因此可以安全地在存储库中运行.
dom*_*gia 15
要以递归sed
方式减少文件,可以grep
使用字符串实例:
grep -rl <oldstring> /path/to/folder | xargs sed -i s^<oldstring>^<newstring>^g
Run Code Online (Sandbox Code Playgroud)
如果你运行man grep
你会发现你也可以定义一个--exlude-dir="*.git"
标志,如果你想省略搜索.git目录,避免git索引问题,正如其他人礼貌地指出的那样.
引导您:
grep -rl --exclude-dir="*.git" <oldstring> /path/to/folder | xargs sed -i s^<oldstring>^<newstring>^g
Run Code Online (Sandbox Code Playgroud)
Jim*_*ane 14
一个不错的oneliner作为额外的.使用git grep.
git grep -lz 'subdomainA.example.com' | xargs -0 perl -i'' -pE "s/subdomainA.example.com/subdomainB.example.com/g"
Run Code Online (Sandbox Code Playgroud)
sed*_*nym 12
这个与git存储库兼容,有点简单:
Linux的:
git grep -l 'original_text' | xargs sed -i 's/original_text/new_text/g'
Run Code Online (Sandbox Code Playgroud)
苹果电脑:
git grep -l 'original_text' | xargs sed -i '' -e 's/original_text/new_text/g'
Run Code Online (Sandbox Code Playgroud)
(感谢http://blog.jasonmeridth.com/posts/use-git-grep-to-replace-strings-in-files-in-your-git-repository/)
Saz*_*han 11
最简单的替换方法(所有文件、目录、递归)
find . -type f -not -path '*/\.*' -exec sed -i 's/foo/bar/g' {} +
Run Code Online (Sandbox Code Playgroud)
注意:有时您可能需要忽略一些隐藏文件,即.git
,您可以使用上面的命令。
如果要包含隐藏文件,请使用,
find . -type f -exec sed -i 's/foo/bar/g' {} +
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,字符串foo
都将替换为新字符串bar
find /home/www/ -type f -exec perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +
Run Code Online (Sandbox Code Playgroud)
find /home/www/ -type f
将列出/ home/www /(及其子目录)中的所有文件."-exec"标志告诉find在找到的每个文件上运行以下命令.
perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +
Run Code Online (Sandbox Code Playgroud)
是对文件运行的命令(一次多个).该{}
被按文件名称进行替换.将+
在命令的末尾告诉find
给了很多文件名建立一个命令.
根据find
手册页:"命令行的构建方式与xargs构建命令行的方式大致相同."
因此,可以在不使用xargs -0
或的情况下实现您的目标(并处理包含空格的文件名)-print0
.
小智 7
尝试这个:
sed -i 's/subdomainA/subdomainB/g' `grep -ril 'subdomainA' *`
Run Code Online (Sandbox Code Playgroud)
我只需要这个并且对可用示例的速度不满意.所以我想出了自己的:
cd /var/www && ack-grep -l --print0 subdomainA.example.com | xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g'
Run Code Online (Sandbox Code Playgroud)
Ack-grep在查找相关文件方面非常有效.这个命令轻而易举地取代了~14.5万个文件,而其他文件花费了很长时间,我不能等到它们完成.
根据这篇博文:
find . -type f | xargs perl -pi -e 's/oldtext/newtext/g;'
Run Code Online (Sandbox Code Playgroud)
或使用极快的 GNU Parallel:
grep -rl oldtext . | parallel sed -i 's/oldtext/newtext/g' {}
Run Code Online (Sandbox Code Playgroud)
小智 5
#!/usr/local/bin/bash -x
find * /home/www -type f | while read files
do
sedtest=$(sed -n '/^/,/$/p' "${files}" | sed -n '/subdomainA/p')
if [ "${sedtest}" ]
then
sed s'/subdomainA/subdomainB/'g "${files}" > "${files}".tmp
mv "${files}".tmp "${files}"
fi
done
Run Code Online (Sandbox Code Playgroud)
小智 5
grep -lr 'subdomainA.example.com' | while read file; do sed -i "s/subdomainA.example.com/subdomainB.example.com/g" "$file"; done
我想大多数人不知道他们可以将某些内容通过管道传输到“同时读取文件”中,并且它避免了那些讨厌的 -print0 参数,同时保留文件名中的空格。
echo
在 sed 之前进一步添加一个允许您在实际执行之前查看哪些文件将更改。
您可以使用 awk 来解决这个问题,如下所示,
for file in `find /home/www -type f`
do
awk '{gsub(/subdomainA.example.com/,"subdomainB.example.com"); print $0;}' $file > ./tempFile && mv ./tempFile $file;
done
Run Code Online (Sandbox Code Playgroud)
希望能帮到你 !!!
如果您需要排除目录(--exclude-dir=.svn
)并且文件名中带有空格(使用0Byte和grep -Z
andxargs -0
grep -rlZ oldtext . --exclude-dir=.svn | xargs -0 sed -i 's/oldtext/newtext/g'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
487924 次 |
最近记录: |