如何使用 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 在文件中查找和替换字符串的主要内容,如果未能解决你的问题,请参考以下文章

Linux中的grep,sed,find的使用方法

shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)

linux四剑客-grep/find/sed/awk/详解-技术流ken

grep 或 find 和 sed 替换字符串

find/pg/grep/sed/awk命令

linux下查找文件及文件内查找内容--find/grep/sed/awk