- Есть ли способ использовать
sed
, чтобы он удалял только точное совпадение вместо строк, содержащих foo?
Да, вы можете для данного примера, если вы пометите свой шаблон поиска, чтобы он точно совпадал с foo:
, вы можете удалить его. Например, если вы делаете ниже
sed '/^foo:/d' file
Шаблон ^
отмечает, что строка, начинающаяся с foo
, сопровождается знаком двоеточия :
, который соответствует вашему варианту использования. Предполагается, что foo
может быть частью только первого столбца
- Есть ли способ использовать разделители с sed, чтобы я мог использовать и заголовок, и автора?
- Должен ли я использовать что-то кроме sed?
Если вы имеете дело с входным файлом, есть фиксированный ограничитель, например :
, который никогда не станет частью вашего допустимого содержимого столбца, тогда лучше использовать awk
/ perl
подходит для легкого чтения текста после установки ограничителя.
В качестве примера рассмотрим, например, если вы хотите изменить название количества из четвертого столбца для одной конкретной книги с именем foobar
, с помощью awk
вы можете просто сделать
awk -F: 'BEGIN { OFS = FS } $1 == "foobar" { $4 = 6 }1' input-file
Чтобы декодировать вышеуказанную строку, содержимое в '..'
не затрагивается оболочкой и передается буквально команде, поэтому мы заключаем содержимое в одинарные кавычки. Также операторы внутри него не имеют смысла в контексте оболочки.
Таким образом, -F:
устанавливает разделитель входного поля на :
, то есть когда команда читает строку файла построчно, первая строка разбивается на токены, разделенные :
. Первый столбец помечен $1
, который расширен до $NF
, что означает последний столбец строки. Деталь BEGIN { OFS = FS }
назначает разделитель поля вывода тем же, что и вход, т. Е. Сохраняет ограничение :
, когда awk
также записывает выходные данные.
Часть $1 == "foobar" { $4 = 6 }
почти не требует пояснений в том смысле, что если первый столбец содержит строку в кавычках, выполните действие внутри {..}
, для которого значение четвертого столбца установлено как 6
. {..}1
является сокращенной записью для {...; print}
, которая предназначена для восстановления строки на основе определенных разделителей поля вывода / записи.