如何使用 Find / Grep / Sed 在文件中查找和替换字符串
Posted
技术标签:
【中文标题】如何使用 Find / Grep / Sed 在文件中查找和替换字符串【英文标题】:How to Find & Replace a String Within Files with Find / Grep / Sed 【发布时间】:2020-11-15 19:04:44 【问题描述】:我有一个包含 500 个 *.INI 文件的文件夹,我需要手动编辑这些文件。在每个 INI 文件中,我都有 Source =
行。我希望那条线变成Source = C:\software\filename
。
例如,需要将 dx4.ini 文件修复为:Source = C:\software\dx4
有没有使用 Find、Grep 或 Sed 函数的快速方法?
【问题讨论】:
请添加您尝试过的内容,如果对这一切完全陌生,我建议您通过unix.stackexchange.com/questions/112023/…,如果您遇到的命令卡住了,请在这里提问试过 这可能对bash
有帮助:for filename in *.INI; do base="$filename%*.INI"; echo "$base $filename"; done
关于您编辑内容的愿望:不要。创建一个新目录并使用数据写入新文件。该过程完成并经过验证后,删除旧目录树。尝试直接编辑文件绝对不会给您带来任何好处,并且会带来不必要的数据损坏风险。
【参考方案1】:
find *.ini -type -f > stack
while read line
do
sed -i s"@Source =@Source = C:\\software\\dx4@" "$line"
done < stack
假设 a 您已经使用“-i”(插入标志,AFAIK 并不总是可移植的)并且 b sed 不会对双转义序列自欺欺人,我认为这会起作用。
【讨论】:
【参考方案2】:使用 GNU awk 将第三个参数用于 match()、gensub() 和“就地”编辑:
awk -i inplace '
match($0,/(.*Source = C:\\software\\)filename(.*)/,a)
fname = gensub(/\..*/,"",1,FILENAME)
$0 = a[1] fname a[2]
1' *.INI
以上假设您在 UNIX 环境中运行,尽管您使用术语 folder
而不是 directory
并且以 C:
开头并包含反斜杠的路径让我怀疑。如果您在 Windows 上,则将 2 '
s(不包含)之间的部分保存在名为 foo.awk
的文件中,并将其作为 awk -i inplace foo.awk *.INI
执行,或者您通常在 Windows 中执行这样的命令。
【讨论】:
【参考方案3】:如果您想编辑脚本中的文件,我认为ed
是要走的路。结合shellfor
循环:
for file in *.INI; do
base=$(basename "$file" .INI)
ed -s "$file" <<EOF
/^Source =/s/=/= C:\\\\software\\\\$base/
w
EOF
done
(这确实假设文件名的名称中没有换行符或与号)
【讨论】:
【参考方案4】:你可以试试 sed 例如
输入文件内容: 文件.txt
Source =
some lines..
脚本:
newstring='Source = C:\software\dx4'
oldstring='Source ='
echo `sed "s/$oldstring/$newstring/g" file.txt` > file.txt
运行上述命令后 输出:
Source = C:\software\dx4
some lines..
【讨论】:
我建议删除echo
和两个反引号。以上是关于如何使用 Find / Grep / Sed 在文件中查找和替换字符串的主要内容,如果未能解决你的问题,请参考以下文章
shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)