Как найти строку, находящуюся в конце строки в сценарии оболочки, используя grep - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть файл, в котором я ищу числа, которые находятся в конце строки

Попробуй и доверься, Горацио Алджер младший 1

Ровер Бойз в школе, Артур М. Уинфилд 11

Бродяга за границей, часть 1, Марк Твен 23

если я ищу 1, я хочу напечатать первую строку, где 1 находится в конце строки. Не вторая строка, где есть 11, или третья строка, где 1 находится в середине предложения.

echo "Enter the content you are searching for:"  
    read foo

if x=$(grep -A 1 -i "$foo\$" GUTINDEX.ALL)
    then echo -e "$x"
fi

\ $ для определения конца строки, но это не работает. Почему?

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

с awk:

$ foo=1
$ awk -v s="$foo" '$NF==s' file
Try and Trust, by Horatio Alger, Jr. 1

Разъяснения:

$ awk -v s="$foo" '  # the search term in s var
$NF==s               # if the last field is equal to s print the record
' file
0 голосов
/ 29 апреля 2018

Если вы пытаетесь создать скрипт, который позволяет вводить регулярное выражение (регулярное выражение) в качестве аргумента (позиционный параметр), вы можете просто использовать форму

grep "$2" "$1"

, где "$2" - это регулярное выражение, а "$1" - имя файла. Вы также можете добавить любые дополнительные параметры для grep по желанию (например, -A 1 для одной строки контекста после совпадения и т. Д.)

Краткий пример:

#!/bin/bash

[ -z "$1" -o -z "$2" ] && {
    printf "error: insufficient input.\n"
    printf "usage: %s filename regex\n" "${0##*/}"
    exit 1
}

[ -r "$1" ] || {
    printf "error: file not readable '%s'\n" "$1"
    exit 2
}

grep "$2" "$1"

( примечание: нет необходимости экранировать '$', поскольку он теряет свое особое значение, когда содержится в строке - расширение не выполняется - до тех пор, пока оно заключено в кавычки)

Пример использования / Вывод

$ bash parse.sh gutindex.all '[^0-9]1$'
Try and Trust, by Horatio Alger, Jr. 1

или

$ bash parse.sh gutindex.all '23$'
A Tramp Abroad, Part 1, by Mark Twain 23

Есть несколько способов подойти к этому. Посмотрите и дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 29 апреля 2018

Проблема в том, что строка, содержащая 11, также заканчивается 1. Попробуйте добавить пробел перед foo, чтобы вы соответствовали целому числу:

if x=$(grep -A 1 " ${foo}$" GUTINDEX.ALL)

Примечание -A 1 также вернет строку после матча - я предполагаю, что это то, что вы хотели, поэтому я оставил его, но если не удалил. -i не требуется для чисел, здесь не используется заглавная буква. Также вам не нужно экранировать $, если за ним не следует ничего, что можно считать именем переменной - bash будет воспринимать его как обычный $. {...} для ясности. Спасибо @EdMorton за предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...