![无需 awk 或 sed 的字符串操作](https://linux22.com/image/75541/%E6%97%A0%E9%9C%80%20awk%20%E6%88%96%20sed%20%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%93%8D%E4%BD%9C.png)
感谢对此问题的任何帮助我有一个具有以下格式的文本文件
我们可以安全地假设名称始终为 3 个字符长,职业为 7 个字符,薪水为 5 个字符。变量来自用户输入,而不是作为参数。
BobJanitor20000
TedBuilder30000
NedFighter25000
KitTeacher40000
我要求用户输入姓名和另一个输入是否显示职业或薪水
如果用户输入“Ted”并选择薪水,则输出应为
Ted 30000
该程序还必须考虑部分姓名匹配,“ed”和薪水应该输出
Ted 30000
Ned 25000
我知道cut
并且grep
可以给我相关的行,但是如何创建我想要的输出?
答案1
$ grep -F ed file|fold -w 5|fold -w 3|grep -E '^[[:upper:]]..|^[0-9]'|paste -sd ' \0\n' -
Ted 30000
Ned 25000
或者:
$ cut -c 1-3,11- file | grep -F ed | fold -w 3 | paste -sd ' \0\n' -
Ted 30000
Ned 25000
或者(假设 GNU grep
):
$ grep -oE '^.{3}|.{5}$' file | paste -sd ' \n' - | grep -F ed
Ted 30000
Ned 25000
您还可以执行以下操作(假设外壳具有进程替换支持):
separate() {
fold -w 1 -- "$@" |
paste -sd '\0\0 \0\0\0\0\0\0 \0\0\0\0\n' - |
sort -k 1,1
}
join <(separate file | cut -d ' ' -f 1 | grep -F ed
) <(separate file) | cut -d ' ' -f 1,3
答案2
这是一个用于名称搜索的脚本。我正在使用一个这里的文档(又名heredoc)而不是外部文件将列表传递到 while 循环,以便将其全部包含在该文件中以便于阅读。您可以根据需要扩展它。
阅读man bash
有关信息内置命令,(并在手册中搜索我粗体显示的内容)我正在使用,
- 子串扩展获取线路的各个部分
- 正则表达式匹配找到匹配=~
- [[...]] 返回一个有条件的值(0 或 1)取决于内部表达式
脚本如下:
read -p "Input Name: " SearchName
while read line
do
Name=${line:0:3}
Job=${line:3:7}
Salary=${line:10:5}
[[ $Name =~ $SearchName ]] && echo $Name $Salary
done << "end--"
BobJanitor20000
TedBuilder30000
NedFighter25000
end--
user@machine:~/tmp$ bash manipvar.sh
Input Name: ed
Ted 30000
Ned 25000
user@machine:~/tmp$
答案3
假设分隔是基于大写字母。
与SED
姓名+工资
sed -e "/${NamePart}.*[A-Z].*/ !d" -e 's/\([A-Z][a-z]*\)[A-Z][a-z]*\([0-9]*\)/\1 \2/' YourData.file
姓名+职业
sed -e "/${NamePart}.*[A-Z].*/ !d" -e 's/\([A-Z][a-z]*\)\([A-Z][a-z]*\)[0-9]*/\1 \2/' YourData.file
答案4
这对我有用
$ echo `grep -oe '^...\|[0-9]\{5\}' filename` | grep -oe '.\{9,10\}$\?' | grep ed
Ted 30000
Ned 25000