我正在学习有关 Bash 脚本的知识,并且遇到了这个示例:
任务是编写一个 Bash 脚本,该脚本读取第一个参数给出的文件,提取与第二个参数给出的 ID 相同的那些记录,并保存在第三个参数给出的位置。
因此,该文件是一个用户列表,每行包含一个用户的信息,它看起来像这样(ID、姓名、父亲的姓名、位置、电话)
43 John Mike Smith Boston +3 685 123456
Run Code Online (Sandbox Code Playgroud)
在“过滤”之后,我必须将找到的数据写入标准输出,并进行以下修改:位置的第一个字母应与 ID 连接,然后名称应仅包含父亲姓名的第一个字母和一个没有任何前缀的电话。
给定示例的输出如下所示:
B43 John M Smith 123456
Run Code Online (Sandbox Code Playgroud)
解决办法是:
#!/bin/bash
cat $1|grep "^$2[0-9]*.*$3 +[0-9]*\ [0-9]*\ [0-9]*"|
sed "s/\([0-9]*\)\t\(.*\)\t\(.\).*\t\(.*\)\t\(.\).*\t+[0-9]*\ [0-9]*\
\([0-9]*\)/\5\1 \2 \3 \4 \6/"
Run Code Online (Sandbox Code Playgroud)
我不明白|
垂直线的意义是什么——我知道它们是管道,一个“查询”的输出数据用作另一个“查询”的输入数据。通过查询,我的意思是一个 shell 命令。
我得到了grep
命令的部分。
我没有得到sed
命令。这是如何工作的?它如何“知道”将位置的第一个字母放在行首?