Как искать в определенном диапазоне позиций по строке

У меня есть текстовый файл, который имеет 60 позиций символа. Я хочу смочь искать значение/слово, вводимое пользователем в положения 05-12. Как я иду о выполнении этого, не используя awk, жемчуга, и т.д.?

Например, текстовый файл

commA6314   ifosfamide               30     12 

home5341209 urokinase    6314               37

И если кто-то вводит 6314, затем это произвело бы строку

commA6314   ifosfamide               30     12

Я думал об использовании grep, но не слишком уверенный. Какая-либо справка?

3
задан 2 March 2017 в 02:25

2 ответа

Вы могли использовать

grep -E "^.{4}.?.?.?.?.?.?.?$pattern" 

где $pattern ввод данных пользователем, я имею в виду в чем-то как

$ echo "enter a pattern: "; read pattern; grep -E "^.{4}.?.?.?.?.?.?.?$pattern" file
enter a pattern: 
6314
commA6314   ifosfamide               30     12 

^.{4}.?.?.?.?.?.?.? это - первые 4 заблокированные символа, затем следующие 7 символов являются дополнительными, означая, является ли шаблон только одним символом, и это находится в 12-м положении, было бы найдено, и если бы это - 7 символов и начинает с 5-го положения, это было бы все еще найдено.

  • ^ запустите строки
  • . любой символ
  • {4} четыре из предшествующего символа
  • ? нуль или один из предшествующего символа
2
ответ дан 1 December 2019 в 16:20

Bash позволяет извлекать подстроки определенной переменной. Все, что необходимо сделать, является файлом чтения линию за линией в while IFS= read -r структура:

#!/bin/bash
while IFS= read -r line;
do
    if [[ ${line:5:12} =~ "$1" ]];
    then
        echo "$line"
    fi
done < "$2"

Примечание синтаксис: в ${var:5:12} 5 стартовая позиция, и 12 смещается, так в этом случае она ищет от символьного положения 5 до 17. Если необходимо вычислить смещение на основе входа пользователя, можно использовать арифметику удара для определения смещения как end=$((12-5)) и использование что переменная в рамках выражения подстроки как ${var:5:$end}

Тестовый прогон:

$ ./search_substrings.sh "6314" input.txt                                                                                
commA6314   ifosfamide               30     12  

Примечание, что это избегает использования внешних инструментов как grep, который придерживается требований, хотя имеют в виду, это не очень практическое решение, и в реальном мире Вы использовали бы Perl или awk

1
ответ дан 1 December 2019 в 16:20

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

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