Ответ 1
sed
- редактор потока. Он работает с потоками символов на основе строки. Он имеет примитивный язык программирования, который включает в себя циклы стиля goto и простые условные обозначения (в дополнение к сопоставлению шаблонов и сопоставлению адресов). Существуют, по существу, только две "переменные": пространство шаблонов и пространство удержания. Чтение скриптов может быть затруднено. Математические операции в лучшем случае необычайно неудобны.
Существуют различные версии sed
с различными уровнями поддержки параметров командной строки и языковых функций.
awk
ориентирован на разделенные поля на основе строки. Он имеет гораздо более надежные конструкторы программирования, включая if
/else
, while
, do
/while
и for
(итерация типа C и массив). Существует полная поддержка переменных и одномерных ассоциативных массивов плюс (IMO) kludgey многомерных массивов. Математические операции похожи на те, что указаны в C. Он имеет printf
и функции. "K" в "AWK" означает " K ernighan", как в "Kernighan and Ritchie" книги "C Programming Language" (не забыть A ho и W einberger). Можно было бы написать детектор академического плагиата с помощью awk
.
GNU awk
(gawk
) имеет множество расширений, включая истинные многомерные массивы в последней версии. Существуют и другие варианты awk
, включая mawk
и nawk
.
Обе программы используют регулярные выражения для выбора и обработки текста.
Я хотел бы использовать sed
, где в тексте есть шаблоны. Например, вы можете заменить все отрицательные числа в некотором тексте, которые находятся в форме "минус-знак, за которым следует последовательность цифр" (например, "-231.45" ) с формой "скобки бухгалтера" (например, "(231.45)" ), используя это (у которого есть место для улучшения):
sed 's/-\([0-9.]\+\)/(\1)/g' inputfile
Я бы использовал awk
, когда текст больше похож на строки и столбцы или, поскольку awk
ссылается на них "записи" и "поля". Если бы я собирался выполнить аналогичную операцию, как описано выше, но только в третьем поле в файле с простыми запятыми я мог бы сделать что-то вроде:
awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile
Конечно, это просто очень простые примеры, которые не иллюстрируют весь спектр возможностей, которые каждый может предложить.