sed '/\n/P;//!s/_\.[^ ("]*Text([^)]*)/\n&\n/;D' files... >results.txt
... наверное, сработает. Запустите свой пример данных, которые он напечатает:
_.Text("Hello World!")
_.Text("Foo")
_.ActionText("Bar")
Все, что он делает, это пытается заключить первое совпадение в строку в \ n
ewlines. Независимо от того, удастся ли ему это, D
удаляет до первой \ n
ewline в пространстве шаблонов - что для несоответствующей строки полностью удаляет ее из вывода, но для совпадения удаляет только до головы вашего шаблона, и сценарий начинается снова сверху. Если \ n
ewline соответствует в пространстве шаблонов - что может произойти, только если совпадение было только что найдено, а затем выбрано D
, то sed
печатает только до первая встречающаяся \ n
строка в пространстве шаблонов, которая находится в конце вашей совпадающей строки. Учреждение s ///
- !
не выполняется, когда в пространстве шаблонов уже есть \ n
ewline, поэтому команда D
elete очищает уже напечатанное совпадение, и цикл начинается снова с конца последнего матч дальше.
В зависимости от вашего sed
вам может потребоваться использовать буквальную \ n
ewline вместо n
в правом поле подстановки. Но вы должны иметь возможность использовать все аргументы файла одновременно - или, по крайней мере, очень много одновременно (в зависимости от ваших ограничений ARGMAX) . Вы можете просто использовать glob в оболочке или, возможно, сделать ...
find /path -name pattern -exec sed script_above {} + >>results.txt
... потому что sed
будет обрабатывать все входные файлы как единый поток.
Я действительно могу порекомендовать Tracktion Waveform. Вы можете использовать его предшественника Tracktion 7 бесплатно.