【问题标题】:Sed REMOVE / REPLACE double parenthesessed REMOVE / REPLACE 双括号
【发布时间】:2018-10-18 04:06:17
【问题描述】:

我有一个 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;但我需要这个,以防它有多行长..

我可以做些什么来改进这种模式?

【问题讨论】:

  • 您可以将sed -z 's/print(\(([^)]*)\))/print\1/g' 用于足够小的输入文件。但如果括号内的内容包含) 并假定输入文件不包含ASCII NUL 字符,这将失败...
  • 另外,为避免因输入文件名引起的问题,请使用grep -rlZ 'regex' | xargs -0 sed ...
  • perl -0777 -pe 's/print\(\((.*?)\)\)/print($1)/sg' 可能比sed 版本更好,因为)) 作为括号内内容的一部分可能比) 更罕见
  • @Sundeep 有时是这样的:print(( something, somethingelse() ))
  • @Sundeep 我必须用这个作为目录,所以test.txt 将被替换为./

标签: python linux design-patterns sed parentheses


【解决方案1】:

为避免因输入文件名引起的问题,请使用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.*')甚至是备份目录(例如:-i'bkp_dir/*') - 这些有助于保留原件供以后使用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2015-01-14
    • 2021-09-07
    • 2012-06-03
    • 2011-01-12
    相关资源
    最近更新 更多