Sed REMOVE / REPLACE双括号

时间:2018-05-08 08:51:43

标签: python linux design-patterns sed parentheses

我有一个python文件,它有很多这样的双括号,我想用单括号替换。 有时打印会持续2行或更多。

print(('>>   # some text some text some text and ' 
+ 'some more text'))
print(('>>   # some text some text some text and ' 
+ 'some more text'))

print(('>>   # some text some text some text and ' 
+ 'some more text'))


print(('>>   # some text some text some text and ' 
+ 'some more text'))


print((something))
print((something))

print((something))

print((something))


print((something))



print((something))

我尝试了很多不同的方法来解决这个问题。我认为最简单的是sed。我有这样的事情:

grep -rl 'print((' test.txt | xargs sed -i "N;s/print((\(.*\)))/print(\1)/g"

输出如下:

print('>>   # some text some text some text and ' 
+ 'some more text')
print('>>   # some text some text some text and ' 
+ 'some more text')

print(('>>   # some text some text some text and ' 
+ 'some more text'))


print(('>>   # some text some text some text and ' 
+ 'some more text'))


print(something)
print(something)

print(something)

print(something)


print(something)



print(something)

现在有一些线路可以工作,但有些线路没有,我认为这是因为N;但我需要这个,以防它是多行... ..

我该怎么做才能改善这种模式?

1 个答案:

答案 0 :(得分:0)

为避免输入文件名引起的问题,请使用grep -rlZ 'regex' | xargs -0 <command ...>


如果括号内的内容没有)),那么你可以使用这个

grep -rlZ 'print((' | xargs -0 perl -i -0777 -pe 's/print\(\((.*?)\)\)/print($1)/sg'
  • -0777将整个文件内容作为单个字符串粘贴,因此该解决方案不适合不符合内存要求的大型文件
  • .*?non-greedy matching
  • s修饰符可以匹配\n以及.

使用-i选项时,您可以指定备份后缀(例如:-i.bkp)或前缀(例如:-i'bkp.*')甚至是备份目录(例如:{{1} }) - 这些有助于保留原始副本以供进一步使用