Как изменить три команды (регулярные выражения) в одной строке для использования в sed (вместо fnr.exe) - PullRequest
0 голосов
/ 16 апреля 2020

Я использую fnr.exe (https://findandreplace.codeplex.com).

Моя домашняя работа:

Value: String
Details: other_str
Number: xxx
Value: String
Details: other_str
Number: xxx
Value: String
Details: other_str
Number: xxx
Value: String
Details: other_str
Number: xxx

после использования fnr.exe у меня

 String
 xxx
 String
 xxx
 String
 xxx
 String
 xxx

Действительно хороший инструмент для поиска и замены множества файлов с помощью ie. regex.

Я пытался сегодня сравнить скорость этого инструмента с sed в Cygwin.

К сожалению, моя команда не работает в seed. Не знаю почему. Можете ли вы помочь мне?

На данный момент в fnr.exe я использую эту команду через терминал (и работает хорошо):

"C:\Test\soft\fnr.exe" --cl --dir "C:\Test" --fileMask "*.*" --caseSensitive --useRegEx --find "^(Value: )|^.*(Details).*$\s|^(Number.*: )" --replace ""

Затем я попытался с sed

sed -i 's/^(Value: )|^.*(Details).*$\s|^(Number.*: )/\1/' *.*

и не работает ...


:) :) Хорошо, я НАШЕЛ РЕШЕНИЕ ДЛЯ ЭТОЙ ПРОБЛЕМЫ

ЗДЕСЬ КОД ДЛЯ ВСЕХ ФАЙЛОВ В FOLDER:

sed -i -e '/Details/d' -e 's/Value: //g' -e 's/Number: //g' *.txt

Пояснение - мы хотим удалить вторую строку и две строки «Значение» и «Число» и сохранить их на месте во всех текстовых файлах или для одного файла ie. (example.txt вместо * .txt)

Удалить вторую строку

sed -i -e '/Details/d'   

Удалить строку "Значение"

-e 's/Value: //g'   

Удалить строку "Число"

-e 's/Number: //g' 

Скорость между FNR.EXE и SED огромна!

Example.txt (несколько миллионов записей)

FNR.EXE - 3 минуты

SED - 36 секунд :):)

Интересно, будет ли awk или grep быстрее, чем sed?

Ура!

1 Ответ

1 голос
/ 16 апреля 2020

Grep здесь не поможет, так как вам нужно удалить части строк.

Вы можете использовать регулярное выражение POSIX ERE (доступно с опцией -E) с sed, как

sed -i -E '/Details/d;s/(Value|Number): //g' *.txt

См. онлайн sed демо .

Однако обычно рекомендуется awk:

awk '!/Details/{gsub(/(Value|Number): /, ""); print}' *.txt

См. онлайн awk демо

Подробности

  • !/Details/ - если строка не содержит Details
  • gsub(/(Value|Number): /, "") (примечание ввод для gsub - это целая строка, поскольку входная переменная опущена) - удалите Value: и Number: с пробелом после них и
  • print - выведите измененную строку ($0 ).
...