如何在多行中替换[
with \[
,每行可能出现多次,但仅在以 开头的行上替换ABCD
?
答案1
在sed
:
sed '/^ABCD/ s/\[/\\[/g' filename
该表达式是一个地址,后跟一个命令。地址 ,表示仅当该行与正则表达式匹配(以 开头的行)/^ABCD/
时才会执行该命令。^ABCD
ABCD
命令 ,s/\[/\\[/g
表示将所有出现的 替换[
为\[
。一般情况下,该命令的形式为s/foo/bar/
,表示将正则表达式替换foo
为bar
。最后的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
这以相当简单的方式工作: - 如果行以 开头ABCD
,gsub()
将进行替换。 - 由于 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