Помогите понять команду sed

Помимо проблем с разрешениями и совместимости с POSIX, утилиты проверки файловой системы NTFS не могут устранить все проблемы, которые может быть Windows 'chkdsk.exe. Это не проблема при двойной загрузке с Windows (если у вас нет отдельного раздела /boot, и в этом случае все будет не загружаться). Проще говоря, драйверы NTFS, доступные для Linux, не являются полнофункциональными.

3
задан 2 November 2017 в 20:04

3 ответа

Здесь есть пара странных вещей. Во-первых, поскольку я только что научился отвечать на ваш вопрос (спасибо!), [F2] имеет классный трюк:

/foo/s//bar/

Это означает, что «если эта строка соответствует foo, замените все, что было согласовано foo с bar. Я действительно не понимаю его смысла, если честно, вы могли бы сделать то же самое с простым s/foo/bar/, но там вы идете.

As для регулярного выражения:

^: соответствует началу строки. [^:]*: когда ^ находится внутри квадратных скобок, это отрицательный набор символов. Таким образом, в то время как [abc] означает a или b или c, [^abc] означает что-либо, кроме a, b или c. Таким образом, [^:]* будет соответствовать 0 или более не :. [eE]xception: это соответствует exception или Exception. :.*: соответствует :, а затем все остальное до конца строки. Наконец, первая часть находится в скошенных скобках (\( \)), что означает, что все, что было сопоставлено []

Следующий бит - это оператор подстановки, здесь s//\1/p. Это означает замену того, что было сопоставлено раньше (inclu за исключением незахваченной части, так что вся линия) с тем, что было захвачено (\1). В результате будет напечатано только то, что было на линии до и включая слово expression (или Expression). И, поскольку -n подавляет вывод, p в конце означает «распечатать эту строку, если замена была успешной.

Наконец, uniq -c предоставит вам количество строк, соответствующих шаблон, найденный в вашем файле. Обратите внимание, что это не число раз, когда в файле происходит слово exception. Если в одной строке есть несколько exception:, это будет считаться единым.

3
ответ дан 22 May 2018 в 16:52
  • 1
    Для /foo/s//bar/ нет особого смысла, но это следствие другой особенности sed - если шаблон поиска пуст , он повторно использует последний шаблон. Вим также делает это. В этом случае я думаю, что это побочный эффект от того, как была создана команда - автор, вероятно, экспериментировал с простым сопоставлением, а затем просто добавил в команду substitute. – muru 2 November 2017 в 22:04
  • 2
    Большое спасибо Тердон. Очень хорошо объяснено. Я узнал что-то новое. Еще раз спасибо :-) – Jack of Some Trades 6 November 2017 в 14:21
  • 3
    @JackofSomeTrades вы очень желанны. Если этот ответ решит вашу проблему, пожалуйста, уделите немного времени, а примите его , нажав на галочку слева. Это ответит на вопрос как ответ, и именно так выражаются на сайтах Stack Exchange. – terdon♦ 6 November 2017 в 14:38

Здесь есть пара странных вещей. Во-первых, поскольку я только что научился отвечать на ваш вопрос (спасибо!), [F2] имеет классный трюк:

/foo/s//bar/

Это означает, что «если эта строка соответствует foo, замените все, что было согласовано foo с bar. Я действительно не понимаю его смысла, если честно, вы могли бы сделать то же самое с простым s/foo/bar/, но там вы идете.

As для регулярного выражения:

^: соответствует началу строки. [^:]*: когда ^ находится внутри квадратных скобок, это отрицательный набор символов. Таким образом, в то время как [abc] означает a или b или c, [^abc] означает что-либо, кроме a, b или c. Таким образом, [^:]* будет соответствовать 0 или более не :. [eE]xception: это соответствует exception или Exception. :.*: соответствует :, а затем все остальное до конца строки. Наконец, первая часть находится в скошенных скобках (\( \)), что означает, что все, что было сопоставлено []

Следующий бит - это оператор подстановки, здесь s//\1/p. Это означает замену того, что было сопоставлено раньше (inclu за исключением незахваченной части, так что вся линия) с тем, что было захвачено (\1). В результате будет напечатано только то, что было на линии до и включая слово expression (или Expression). И, поскольку -n подавляет вывод, p в конце означает «распечатать эту строку, если замена была успешной.

Наконец, uniq -c предоставит вам количество строк, соответствующих шаблон, найденный в вашем файле. Обратите внимание, что это не число раз, когда в файле происходит слово exception. Если в одной строке есть несколько exception:, это будет считаться единым.

3
ответ дан 18 July 2018 в 04:02

Здесь есть пара странных вещей. Во-первых, поскольку я только что научился отвечать на ваш вопрос (спасибо!), [F2] имеет классный трюк:

/foo/s//bar/

Это означает, что «если эта строка соответствует foo, замените все, что было согласовано foo с bar. Я действительно не понимаю его смысла, если честно, вы могли бы сделать то же самое с простым s/foo/bar/, но там вы идете.

As для регулярного выражения:

^: соответствует началу строки. [^:]*: когда ^ находится внутри квадратных скобок, это отрицательный набор символов. Таким образом, в то время как [abc] означает a или b или c, [^abc] означает что-либо, кроме a, b или c. Таким образом, [^:]* будет соответствовать 0 или более не :. [eE]xception: это соответствует exception или Exception. :.*: соответствует :, а затем все остальное до конца строки. Наконец, первая часть находится в скошенных скобках (\( \)), что означает, что все, что было сопоставлено []

Следующий бит - это оператор подстановки, здесь s//\1/p. Это означает замену того, что было сопоставлено раньше (inclu за исключением незахваченной части, так что вся линия) с тем, что было захвачено (\1). В результате будет напечатано только то, что было на линии до и включая слово expression (или Expression). И, поскольку -n подавляет вывод, p в конце означает «распечатать эту строку, если замена была успешной.

Наконец, uniq -c предоставит вам количество строк, соответствующих шаблон, найденный в вашем файле. Обратите внимание, что это не число раз, когда в файле происходит слово exception. Если в одной строке есть несколько exception:, это будет считаться единым.

3
ответ дан 24 July 2018 в 17:59

Другие вопросы по тегам:

Похожие вопросы: