如何在一行中的特定位置范围内进行搜索

如何在一行中的特定位置范围内进行搜索

我有一个包含 60 个字符位置的文本文件。我希望能够搜索用户在位置 05-12 输入的值/单词。如何在不使用 awk、pearl 等的情况下执行此操作?

例如文本文件是

commA6314   ifosfamide               30     12 

home5341209 urokinase    6314               37

如果有人输入6314,那么它将输出以下行

commA6314   ifosfamide               30     12

我原本想使用grep,但不太确定。有什么帮助吗?

答案1

你可以使用

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

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。如果需要根据用户输入计算偏移量,则可以使用 bash 算术来确定偏移量,end=$((12-5))并在子字符串表达式中使用该变量,例如${var:5:$end}

测试运行:

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

请注意,这避免使用符合grep要求的外部工具,但请记住这不是一个非常实用的解决方案,在现实世界中,您宁愿使用Perlawk

相关内容