String 不使用awk或sed的unix bash字符串搜索

String 不使用awk或sed的unix bash字符串搜索,string,bash,shell,unix,search,String,Bash,Shell,Unix,Search,无法使用awk或sed或任何其他字符串处理实用程序 任何关于这个问题的帮助都是非常感谢的,我有一个文本文件,格式如下 BobJanitor20000 TedBuilder30000 NedFighter25000 KitTeacher40000 是的,假设名称总是三个字符长,职业7个字符,薪水5个字符编辑:变量来自用户输入,而不是作为参数 我要求用户输入一个姓名和另一个输入,是否显示职业或薪水 如果用户输入“Ted”并选择薪资,则输出应为 Ted 30000 该计划还必须考虑部分名称匹配,“

无法使用awk或sed或任何其他字符串处理实用程序

任何关于这个问题的帮助都是非常感谢的,我有一个文本文件,格式如下

BobJanitor20000
TedBuilder30000
NedFighter25000
KitTeacher40000
是的,假设名称总是三个字符长,职业7个字符,薪水5个字符编辑:变量来自用户输入,而不是作为参数

我要求用户输入一个姓名和另一个输入,是否显示职业或薪水

如果用户输入“Ted”并选择薪资,则输出应为

Ted 30000
该计划还必须考虑部分名称匹配,“ed”和工资输出

Ted 30000
Ned 25000
我知道cut和grep可以给我相关的行,但是我如何创建我想要的输出呢

剪切-c1-3文本文件| grep“$user_输入”


获取我要使用的行,但如何隔离姓名和职业列,然后隔离姓名和薪资列

例如,您可以对字符范围使用
cut

echo NedFighter25000 | cut -c 1-3
您可能需要:

grep "$user_input" textFile | tee >(cut -c '11-15') | echo `cut -c 1-2`
这称为过程替换


请参见

必须首先在字段中拆分输入行。类似于
grep“$user\u input”textFile
的内容将在输入与作业的一部分匹配时失败。 因此,使用grep的简单方法将失败:

使用grep,您可以选择-o仅显示匹配的部分。将其与一个点组合表示单个字符,并将
^
表示行首,或将
$
表示行尾

# Show salary
# echo "TedBuilder30000" | grep "Ted" | grep -o ".....$"
# Show job
# echo "TedBuilder30000" | grep "Ted" | grep -o "............$" | grep -o "^......."
当您还想显示匹配的名称(Ted/Ned)时,这将变得很混乱

那么我们如何将所有的东西分开呢?
我已经在变量中存储了name和display的userinput。显示器通过
排版-l
自动转换为小写

userinput=ed
typeset -l display
display=Salary
while read line; do
        # offset 0, length 3
        name=${line:0:3}
        job=${line:3:7}
        sal=${line:10:5}
        # echo "Debug: Name=$name Job=$job Sal=$sal"
        # double brackets for matching the userinput with wildcards
        if [[ "$name" = *${userinput}* ]]; then
                # Use case for a switch between different possible values
                case "${display}" in
                "occupation|job") echo "${name} ${job}";;
                "salary") echo "${name} ${sal}";;
                *) echo "Unsupported display ${display}";;
                esac
        fi
done < testFile # While reads from testFile, I avoid using cat (Google for uuoc)
userinput=ed
字体-l显示
显示=工资
读行时;做
#偏移量0,长度3
名称=${line:0:3}
作业=${line:3:7}
sal=${line:10:5}
#echo“Debug:Name=$Name Job=$Job Sal=$Sal”
#双括号用于将userinput与通配符匹配
如果[[“$name”=*${userinput}*]];然后
#不同可能值之间切换的用例
中的大小写“${display}”
“职业|工作”)呼应“${name}${job}”;;
“工资”)回显“${name}${sal}”;;
*)回显“不支持的显示${display}”;;
以撒
fi
done
为什么要限制
awk
sed
?最好展示您迄今为止所做的尝试。这看起来像是作业,你应该是做作业的人:)是的,这是作业,至于我所做的,我觉得这是一个你知道或不知道的知识问题。我知道cut和grep可以让我得到我想要的行,但我被困在那里了cut-c1-3文本文件| grep“$input”可以让我得到相关行,但我如何准确地隔离姓名和职业列或姓名和薪水列?