ag -l "search string" | xargs sed -i '' -e 's/from/to/g'
如果我们把它分解,我们得到的是:
# returns a list of files containing matching string
ag -l "search string"
接下来,我们有:
# consume the list of piped files and prepare to run foregoing command
# for each file delimited by newline
xargs
最后,字符串替换命令:
# -i '' means edit files in place and the '' means do not create a backup
# -e 's/from/to/g' specifies the command to run, in this case,
# global, search and replace
sed -i '' -e 's/from/to/g'
comment() {
}
doc() {
}
function agr {
doc 'usage: from=sth to=another agr [ag-args]'
comment -l --files-with-matches
ag -0 -l "$from" "${@}" | pre-files "$from" "$to"
}
pre-files() {
doc 'stdin should be null-separated list of files that need replacement; $1 the string to replace, $2 the replacement.'
comment '-i backs up original input files with the supplied extension (leave empty for no backup; needed for in-place replacement.)(do not put whitespace between -i and its arg.)'
comment '-r, --no-run-if-empty
If the standard input does not contain any nonblanks,
do not run the command. Normally, the command is run
once even if there is no input. This option is a GNU
extension.'
AGR_FROM="$1" AGR_TO="$2" xargs -r0 perl -pi.pbak -e 's/$ENV{AGR_FROM}/$ENV{AGR_TO}/g'
}
7条答案
按热度按时间dpiehjr41#
我将为使用
ag
, The Silver Searcher对多个文件执行查找/替换操作的用户提供另一个示例。完整示例:
如果我们把它分解,我们得到的是:
接下来,我们有:
最后,字符串替换命令:
zhte4eai2#
第一部分是find命令,用于查找要更改的文件。您可能需要适当地修改它。
xargs
命令获取find命令找到的每个文件,并对其应用sed
命令。sed
命令获取 from 的每个示例,并将其替换为 to。这是一个标准的正则表达式,因此可以根据需要修改它。如果你使用的是svn,那么你的. svn目录也会被搜索和替换,你必须排除这些目录,例如:
或
zvokhttg3#
正如Paul所说,你需要先找到你想要编辑的文件,然后再编辑它们。除了find,还有一种方法是使用GNU grep(Ubuntu的默认设置),例如:
如果你知道你只需要一个特定类型的文件,并且想忽略版本控制目录中的内容,你也可以使用ack-grep(sudo apt-get install ack-grep或visit http://petdance.com/ack/)。例如,如果你只需要文本文件,
使用sed的另一种方法是使用perl,它可以在每个命令中处理多个文件,例如,
在这里,perl被告知就地编辑,首先生成一个.巴克文件。
您可以将管道的任意左侧与右侧组合,具体取决于您的偏好。
n1bvdmb64#
sed
的替代方法是使用rpl
(例如,可从http://rpl.sourceforge.net/或您的GNU/Linux发行版获得),如rpl --recursive --verbose --whole-words 'F' 'A' grades/
monwx1rj5#
典型的
(find|grep|ack|ag|rg)-xargs-sed
组合有几个问题:xargs -r
选项将运行命令,即使没有找到文件,可能会导致问题。这些问题对于递归搜索和替换这样的侵入性和危险的操作来说是足够大的,因此需要开始开发一个专用工具:mo。
早期的测试似乎表明,它的性能介于ag和rg之间,它解决了我遇到的以下问题:
mo -f 'src/.*v1.*' -p bug -w
mo -f 'src/.*v1.*' -p bug -w -r fix
kpbwa7wx6#
为了方便起见,我采用了Ulysse's answer(在纠正了不希望出现的错误打印之后),并将其转换为.zshrc / .bashrc函数:
用法:
find-and-replace Foo Bar
ckocjqey7#
您可以像这样使用它:
不提供路径以使其使用当前目录。请注意,需要安装ag、xargs和perl,并在PATH上。