Вы не используете var1
или var2
для чего-либо, и даже если вы это сделали, циклическое переключение переменных и повторное выполнение sed -i
для одного и того же выходного файла крайне расточительно. В идеале вы хотели бы записать все изменения в один sed
сценарий и обработать файл только один раз.
Не имея возможности угадать, какие у вас есть строки, отличные от "British Library 1"
и требуют ли они различных действий, я бы предложил что-то вроде
sed -i '/^[^,]*_f_[^,_]*,/s/,British Library 1 /,f. /
s/,British Library 1 /,/' "${pathToCSV}_final.csv"
Обратите внимание, как скрипт sed
в одинарных кавычках может быть заключен в несколько физических строк. Первая строка находит любые строки, где последние символы между подчеркиваниями в первом столбце, разделенном запятыми, равны f
, и заменяет ",British Library 1 "
на ",f. "
. (Я внес некоторые коррективы в интервал - надеюсь, они вам пригодятся.) В следующей строке мы просто заменяем любые (оставшиеся) вхождения ",British Library 1 "
просто запятой; идея состоит в том, что только строки, которые не соответствуют регулярному выражению в предыдущей строке, будут по-прежнему содержать эту строку, и поэтому нам не нужно делать другое соответствие регулярному выражению.
Это можно легко расширить, чтобы охватить больше шаблонов в одном и том же сценарии sed
, вместо многократного циклического повторения файла и перезаписи одного шаблона за раз. Например, если ваша следующая задача - заменить Windsor Palace A
либо a.
, либо ничего, в зависимости от того, содержит ли предпоследнее разделенное подчеркиванием подполе в первом поле a
, это должно быть достаточно очевидным:
sed -i '/^[^,]*_f_[^,_]*,/s/,British Library 1 /,f. /
s/,British Library 1 /,/
/^[^,]*_a_[^,_]*,/s/,Windsor Palace A /,a. /
s/,Windsor Palace A /,/' "${pathToCSV}_final.csv"
Более подробно, регулярное выражение говорит
^ beginning of line
[^,]* any sequence of characters which are not a comma
_f_ literal characters underscore, f, underscore
[^,_]* any sequence of characters which are not a comma or an underscore
, literal comma
Вы должны увидеть, что это будет нацелено на последнюю пару подчеркиваний в первом столбце. Важно никогда не пропускать первую запятую и ближе к концу, не допускать подчеркивания после тех, на которые мы специально нацелены, прежде чем мы наконец разрешим разделитель запятой.
Наконец, обратите внимание, как мы всегда используем двойные кавычки вокруг переменных, которые содержат имена файлов. Есть сценарии, где вы можете избежать этого, но вы должны знать, что вы делаете; простое и понятное правило - всегда ставить двойные кавычки вокруг переменных. Для полной информации см. Когда обернуть кавычки вокруг переменной оболочки?