Sed УДАЛИТЬ / ЗАМЕНИТЬ двойные скобки - PullRequest
0 голосов
/ 08 мая 2018

У меня есть файл 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 голосов
/ 08 мая 2018

, чтобы избежать проблем из-за имен входных файлов, используйте grep -rlZ 'regex' | xargs -0 <command ...>


если содержимое в скобках не имеет )), тогда вы можете использовать это

grep -rlZ 'print((' | xargs -0 perl -i -0777 -pe 's/print\(\((.*?)\)\)/print($1)/sg'
  • -0777 для удаления всего содержимого файла в виде одной строки, поэтому данное решение не подходит для больших файлов, которые не соответствуют требованиям к памяти
  • .*? - это не жадное совпадение
  • s позволяет сопоставить \n, а также .

При использовании опции -i вы можете указать суффикс резервной копии (например, -i.bkp) или префикс (например: -i'bkp.*') или даже каталог резервной копии (например: -i'bkp_dir/*') - это поможет сохранить оригинал для дальнейшего использования

...