Вы можете использовать sed для создания сценария sed из terms_list.csv
:
sed '1d;s/,/|/;s|,|/|;s|.*|s/&/g|' terms_list.csv
, который работает следующим образом:
1d # Skip the first line
s/,/|/ # Replace the first comma with a pipe
s|,|/| # Replace the second comma with a slash
s|.*|s/&/g| # Wrap each line in s/ and /g
и имеет следующий вывод:
$ sed '1d;s/,/|/;s|,|/|;s|.*|s/&/g|' terms_list.csv
s/Mangifera indica|M. indica/Mangiferaindica/g
s/Oryza sativa|O. sativa/Oryzasativa/g
Теперь мы используем этот вывод для запуска sed -i
(требуется GNU sed для редактирования на месте) для всех файлов, которые мы хотим изменить:
sed '1d;s/,/|/;s|,|/|;s|.*|s/&/g|' terms_list.csv | sed -i -Ef- text_data_file_*.csv
-E
включаетрасширенные регулярные выражения, поэтому мы можем использовать |
для чередования -f-
читает команды sed из стандартного ввода
Первая команда может быть сделана немного более устойчивойв терминах явных границ слов, чтобы избежать совпадений подстрок:
$ sed '1d;s/,/|/;s|,|)\\b/|;s|.*|s/\\b(&/g|' terms_list.csv
s/\b(Mangifera indica|M. indica)\b/Mangiferaindica/g
s/\b(Oryza sativa|O. sativa)\b/Oryzasativa/g
, где \b
обозначает границу слова (также расширение GNU sed).
Если вход содержитрегулярные выражения метасимволы, мы должны избегать их всех, поэтому первая команда должна выглядеть примерно так:
sed '1d;s/[][*+{}()/\|&^$.?]/\\&/g;s/,/|/;s|,|)\\b/|;s|.*|s/\\b(&/g|' terms_list.csv
Важным дополнением здесь является первая подстановка, которая заботится о метасимволах, экранируя их обратной косой чертой:
s/[][*+{}()/\|&^$.?]/\\&/g
Так что для наихудшего случая scenario, где terms_list.csv
содержит что-то вроде
a[abc]*x+\1{2}|-(o).^$?/\a,other,abc&\1def
, сгенерированная команда будет выглядеть так:
s/\b(a\[abc\]\*x\+\\1\{2\}\|-\(o\)\.\^\$\?\/\\a|other)\b/abc\&\\1def/g
Есть случай, который все еще не охватывается этим: если входной файл CSVсодержит запятые в одном из полей, вам нужно прибегнуть к анализатору CSV для предварительной обработки.Запятые игнорируются при экранировании метасимволов регулярных выражений в третьем решении.