如何在匹配行上将 [ 替换为 \[ ?

如何在匹配行上将 [ 替换为 \[ ?

如何在多行中替换[with \[,每行可能出现多次,但仅在以 开头的行上替换ABCD

答案1

sed

sed '/^ABCD/ s/\[/\\[/g' filename

该表达式是一个地址,后跟一个命令。地址 ,表示仅当该行与正则表达式匹配(以 开头的行)/^ABCD/时才会执行该命令。^ABCDABCD

命令 ,s/\[/\\[/g表示将所有出现的 替换[\[。一般情况下,该命令的形式为s/foo/bar/,表示将正则表达式替换foobar。最后的g使其每行匹配多次,并且由于[\两者在正则表达式中都有特殊功能,因此它们在命令中被转义 --\[表示文字[,而\\[表示文字\[

答案2

也许这是正确的:

perl -nle 'if ( /^ABCD/) { $_ =~ s/\[/\\[/g;};print'

(Perl 初学者在这里...)

答案3

假设您输入了这样的文件:

$ cat input.txt
ABCD this line [ starts with [ abcd
this one doesn't
ABCD but this [ one does

由于您的问题是用 Perl 标记的,因此这里有一个:

$ perl -pe '/^ABCD/ and s/\[/\\[/g' input.txt                                                         
ABCD this line \[ starts with \[ abcd
this one doesn
ABCD but this \[ one does

-p将允许假设隐式循环和自动打印,就像sed所做的那样,并且如果行读取以ABCD.


我们可以在 awk 中这样做:

$ awk '/^ABCD/{gsub(/\[/,"\\[")};1' input.txt                                                         
ABCD this line \[ starts with \[ abcd
this one doesn't
ABCD but this \[ one does

这以相当简单的方式工作: - 如果行以 开头ABCDgsub()将进行替换。 - 由于 awk 代码在evaluation { actions}结构上工作,因此1只是强制在每一行上进行“true”的评估,并且{ actions}省略部分,它将默认打印;基本上,一个小技巧可以让事情变得更短而不是做{print}


因为为什么不呢,这里是 python:

$ python -c 'import sys; print "\n".join([i.strip().replace("[","\[") if i.startswith("ABCD") else i.strip() for i in sys.stdin ])' < input.txt                                                                                 
ABCD this line \[ starts with \[ abcd
this one doesn't
ABCD but this \[ one does

这也以相当简单的方式工作:

  • 我们通过 shell 操作符将文本重定向到 python 的stdin流中<
  • 所有行都在结构内读取和处理[ item for item in iterable]- 这称为列表理解;我们基本上建立了所有线路的列表
  • i.strip().replace("[","\[") if i.startswith("ABCD") else i.strip()非常简单 - 我们修剪尾随换行符,如果该行以“ABCD”开头 - 全部替换[\[,否则 - 只是删除原始行
  • 一旦我们将所有行读入列表,该行列表将重新连接成一个换行符分隔的字符串,并打印。

在脚本形式中,这将是这样的:

#!/usr/bin/env python
import sys
with open(sys.argv[1]) as fd: 
    for i in fd:
        print i.strip().replace("[","\[") if i.startswith("ABCD") else i.strip()

并按如下方式工作:

$ ./add_slash.py input.txt                                                             
ABCD this line \[ starts with \[ abcd
this one doesn
ABCD but this \[ one does

相关内容