Экранирование обратной реакции и двойных кавычек внутри выражения sed (в двойных кавычках)

Если вы хотите "использовать команды оболочки",классическим решением будет конвейер с grep, cut и sort. Некоторые заметки о необходимых шагах (Я частично протестировал):

Во-первых, вы cutсокращаете число столбцов/полей до трех необходимых.

С помощью grepвы выполняете "анализ". Это «читается» только как целое слово? деликатный случай? Значение оценки можно довольно легко проверить в том же регулярном выражении (после вырезания ). Что-то вроде:

grep  "\<[Rr]ead\>.*,.*[2-9][0-9].*,"

Это работает, но вы можете видеть пределы этого "простого" подхода. Оценка «-20» будет считаться «выше 20» (, поскольку она имеет «абсолютное значение 20 или выше», так сказать )

.

С помощью sortвы... сортируете оставшиеся строки, используя на этот раз реальное числовое значение. Это делает команду (pipe )похожей на:

cut OPT FILE | grep "regex" | cut OPT2 | sort OPT >report.txt

Я даже не говорю, что это хорошее решение. Но это должно быть весьма полезно для «обрезки» и «фильтрации» больших файлов, а также для демонстрации.

2
06.01.2021, 15:15
1 ответ

В спецификации оболочки :

2.2.3 Double-Quotes

Enclosing characters in double-quotes ( "" ) shall preserve the literal value of all characters within the double-quotes, with the exception of the characters backquote, dollar-sign, and backslash, as follows:

(...)

The backslash shall retain its special meaning as an escape character only when followed by one of the following characters when considered special:
$ ` " \ <newline>

Следовательно,

Кейс Перед оболочкой (что вы видите)После шелла (что получает Сэд)
1 "s/\"/\"/"s/"/"/
2 "s/\"/\\\"/"s/"/\"/
3 "s/\"/\\\\\"/"s/"/\\"/

В спецификации Sed , sкоманда:

The meaning of an unescaped backslash immediately followed by any character other than '&', backslash, a digit, newline, or the delimiter character used for this command, is unspecified.

Таким образом, в случае 2 вывод не указан (, т. е. реализации Sed бесплатны. толковать такие случаи по своему усмотрению ). GNU Sed воспользовался этой свободой, чтобы предложить несколько специальных символов, среди которых \rдля возврата каретки, \nдля новой строки и т. д. (см. полный список в руководстве). \"не входит в их число и предпочитает просто удалите обратную косую черту. В результате случай 2 становится эквивалентным случаю 1 в GNU Sed.

5
18.03.2021, 22:38

Теги

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