使用命令查找和替换文件中的文本

使用命令查找和替换文件中的文本

如何使用命令行在文本文件中查找和替换特定单词?

答案1

sed -i 's/original/new/g' file.txt

解释:

  • sed= 流编辑器
  • -i= 就地(即保存回原始文件)
  • 命令字符串:

    • s= 替代命令
    • original= 描述要替换的单词的正则表达式(或者仅仅是单词本身)
    • new= 要替换的文本
    • g= 全局(即替换所有而不仅仅是第一次出现)
  • file.txt= 文件名

答案2

实现该目标的方法有很多种。根据字符串替换所要实现目标的复杂程度以及用户所熟悉的工具,某些方法可能比其他方法更受欢迎。

在此答案中,我使用了简单input.txt文件,您可以使用它来测试此处提供的所有示例。文件内容:

roses are red , violets are blue
This is an input.txt and this doesn't rhyme

重击

Bash 并不是真正用于文本处理的,但可以通过以下方式进行简单的替换参数扩展,特别是在这里我们可以使用简单的结构${parameter/old_string/new_string}

#!/bin/bash
while IFS= read -r line
do
    case "$line" in
       *blue*) printf "%s\n" "${line/blue/azure}" ;;
       *) printf "%s\n" "$line" ;;
    esac
done < input.txt

这个小脚本不能进行就地替换,这意味着你必须将新文本保存到新文件中,并删除旧文件,或者mv new.txt old.txt

附注:如果你好奇为什么while IFS= read -r ; do ... done < input.txt使用它,它基本上是 shell 逐行读取文件的方式。请参阅以供参考。

大王

AWK 是一款文本处理实用程序,非常适合此类任务。它可以执行简单的替换以及基于以下代码的更高级的替换:常用表达。它提供了两个函数:sub()gsub()。第一个函数只替换第一次出现的情况,而第二个函数替​​换整个字符串中的出现情况。例如,如果我们有字符串one potato two potato,则结果如下:

$ echo "one potato two potato" | awk '{gsub(/potato/,"banana")}1'
one banana two banana

$ echo "one potato two potato" | awk '{sub(/potato/,"banana")}1'                                      
one banana two potato 

AWK 可以将输入文件作为参数,因此使用 做同样的事情input.txt很容易:

awk '{sub(/blue/,"azure")}1' input.txt

根据您使用的 AWK 版本,它可能具有或不具有就地编辑功能,因此通常的做法是保存并替换新文本。例如像这样:

awk '{sub(/blue/,"azure")}1' input.txt > temp.txt && mv temp.txt input.txt

独立能源管理委员会

Sed 是一个行编辑器。它也使用正则表达式,但对于简单的替换,只需执行以下操作即可:

sed 's/blue/azure/' input.txt

此工具的优点在于它具有就地编辑功能,您可以使用-i标志启用该功能。

Perl

Perl 是另一种常用于文本处理的工具,但它是一种通用语言,可用于网络、系统管理、桌面应用程序和许多其他地方。它借鉴了 C、sed、awk 等其他语言的许多概念/功能。可以按如下方式进行简单替换:

perl -pe 's/blue/azure/' input.txt

与 sed 类似,perl 也有 -i 标志。

Python

这种语言用途广泛,也用于各种各样的应用程序。它有很多处理字符串的函数,其中包括replace(),所以如果你有像这样的变量var="Hello World",你可以这样做var.replace("Hello","Good Morning")

读取文件并替换其中的字符串的简单方法如下:

python -c "import sys;lines=sys.stdin.read();print lines.replace('blue','azure')" < input.txt

但是,使用 Python,您还需要输出到新文件,您也可以在脚本本身中执行此操作。例如,这是一个简单的示例:

#!/usr/bin/env python
import sys
import os
import tempfile

tmp=tempfile.mkstemp()

with open(sys.argv[1]) as fd1, open(tmp[1],'w') as fd2:
    for line in fd1:
        line = line.replace('blue','azure')
        fd2.write(line)

os.rename(tmp[1],sys.argv[1])

此脚本将作为命令行参数调用input.txt。使用命令行参数运行 Python 脚本的确切命令是

 $ ./myscript.py input.txt

或者

$ python ./myscript.py input.txt

当然,请确保它./myscript.py位于您当前的工作目录中,并且对于第一种方法,请确保它被设置为可执行文件chmod +x ./myscript.py

Python还可以有正则表达式,特别是有re模块,里面有re.sub()函数,可以用于更高级的替换。

答案3

有多种不同的方法可以做到这一点。一种是使用sed正则表达式。SED 是一个用于过滤和转换文本的流编辑器。一个例子如下:

marco@imacs-suck: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orly
marco@imacs-suck: ~$ sed s/slow/quick/ < orly > yarly
marco@imacs-suck: ~$ cat yarly
The quick brown unicorn jumped over the hyper sleeping dog

另一种可能比更有意义的方法< strin> strout使用管道!

marco@imacs-suck: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowai
marco@imacs-suck: ~$ cat nowai 
The quick brown fox jumped over the lazy sleeping dog

答案4

通过 awk 的 gsub 命令,

awk '{gsub(/pattern/,"replacement")}' file

例子:

awk '{gsub(/1/,"0");}' file

在上面的例子中,所有 1 都被替换为 0,无论其位于哪一列。


如果你想对特定的列进行替换,那么这样做,

awk '{gsub(/pattern/,"replacement",column_number)}' file

例子:

awk '{gsub(/1/,"0",$1);}' file

它仅将第一列的 1 替换为 0。

通过 Perl,

$ echo 'foo' | perl -pe 's/foo/bar/g'
bar

相关内容