Заменить на sed

Чтобы напечатать строки, для которых последнее слово является чем-то, на ум приходит awk:

awk '$NF == "123"' # string comparison
awk '$NF == 123'   # number comparison, would also match on 0123, 123.0, 1.23e2
awk '$NF == ENVIRON["ENVVAR"]' # number comparison if both $NF and $ENVVAR
                               # look like numbers, string otherwise

Для awkэти слова по умолчанию разделены пробелами -. В зависимости от реализации пробел может быть только символом пробела или табуляции, некоторые из них могут включать другие пробелы Unicode, если они классифицируются как таковые в локали. Реализацияbusyboxawkтакже включает символы вертикального интервала, включая символ возврата каретки.

Если ваш файл отформатирован с использованием разделителей строк MS -DOS, то есть последовательности символов CR LF, а не просто LF, то описанное выше не будет работать, кроме как с busybox awk. И даже с busybox awk в строках вывода по-прежнему будут те проблемные управляющие символы, которых не должно быть в Unix.

Таким образом, вы должны предварительно обработать ввод с помощью dos2unixили d2u, чтобы преобразовать окончания строк в формат Unix.

< file.dos dos2unix | awk '$NF == 123'

Ваш входной файл выглядит так, как будто он состоит из записей, разделенных пустыми строками. Если вы хотите напечатать полные записи для номера книги, вы можете сделать:

export BOOKNUMBER=123
< file.dos dos2unix | awk -v RS= -F '\n' '
    field[split($1, field, " ")] == ENVIRON["BOOKNUMBER"]'

Там мы устанавливаем разделитель записей на пустую строку для входа в режим абзаца(записи, разделенные пустыми строками ), и разделитель полей на новую строку (, также известную как LF ), поэтому первая строка каждой записи находится в$1(первом поле ). Мы разделяем эту первую строку специальным разделителем полей " ", который по умолчанию является словом , разбивающимся на массив field.А затем сравнение последнего элемента этого массива(split()возвращает количество элементов, поэтому field[split()]— это последний элемент )с содержимым переменной окружения $BOOKNUMBER.

0
06.02.2020, 01:46
1 ответ

Зафиксируйте цифры до и после запятой.

sed -e 's/\([0-9]\),\([0-9]\)/\1.\2/g'

Нет необходимости ставить запятую в обратную сторону, она не имеет значения в sed. Кроме того, точка не является специальной в замещающей части, поэтому обратная косая черта также не требуется.

2
28.04.2021, 23:24

Теги

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