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

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

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

解释说明:

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

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

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

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

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

巴什

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

#!/bin/bashwhile IFS= read -r linedo    case "$line" in       *blue*) printf "%s\n" "${line/blue/azure}" ;;       *) printf "%s\n" "$line" ;;    esacdone < 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是一个行编辑器。 它也使用正则表达式,但对于简单的替换就足够了:

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

这个工具的好处是它有就地编辑,你可以用它来启用 -i 国旗。

Perl的

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

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

和sed一样,perl也有-i标志。

巨蟒

这种语言是非常通用的,也用于各种各样的应用程序。 它有很多用于处理字符串的功能,其中包括 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 pythonimport sysimport osimport tempfiletmp=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() 功能,可用于更高级的替换。

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

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

另一种可能比 < strin> strout 是用管子的!

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

通过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

你可以在Ex模式下使用Vim:

ex -s -c '%s/OLD/NEW/g|x' file
  1. % 选择所有行

  2. s 替代品

  3. g 替换每行中的所有实例

  4. x 写入,如果已经进行了更改(他们有)并退出

seds特雷姆 教育署伊托尔,在你可以使用 | (管道)发送 标准流 (Stdin和STDOUT具体)通过 sed 并以编程方式随时更改它们,使其成为Unix哲学传统中的一个方便的工具;但也可以使用 -i 下面提到的参数。
考虑以下几点:

sed -i -e 's/few/asd/g' hello.txt

s/ 是用来 substitute找到的表达式 fewasd:

少数,勇敢。


Asd,勇敢者。

/g 代表"全球",意思是为整个行做到这一点。 如果你离开 /g (与 s/few/asd/,总是需要有三个斜线不管是什么)和 few 在同一行上出现两次,只有第一个 few 被更改为 asd:

少数男人,少数女人,勇敢的人。


Asd的男人,少数的女人,勇敢的人。

这在某些情况下很有用,比如在行的开头改变特殊字符(例如,用水平标签替换一些人用来在电子邮件线程中引用先前材料的大于符号,同时在行的后面留下引用的代数不等式),但是在你的例子中,你指定 任何地方 few 如果它应该被替换,请确保你有那个 /g.

以下两个选项(标志)合并为一个, -ie:

-i 选项用于编辑 in放在档案上 hello.txt.

-e 选项指示 expression/命令运行,在这种情况下 s/.

注意:使用它很重要 -i -e 要搜索/替换。 如果你这样做 -ie,您创建每个文件的备份,并附加字母"e"。

你可以这样做:

locate <part of filaname to locate> | xargs sed -i -e "s/<Old text>/<new text>/g" 

示例:将所有出现的[logdir',"](不带[])替换为[logdir',os。getcwd()]在locate命令的所有文件中,执行:

ex1:

locate tensorboard/program.py | xargs sed -i -e "s/old_text/NewText/g"

ex2:

locate tensorboard/program.py | xargs sed -i -e "s/logdir', ''/logdir', os.getcwd()/g"

哪里[tensorboard/program.py]是要搜索的文件