我有一个包含 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
要求的外部工具,但请记住这不是一个非常实用的解决方案,在现实世界中,您宁愿使用Perl
或awk