修改列表:过滤它,并重新排列结果中的值

Nev*_*arn 3 command-line bash scripts text-processing

我有一个包含以下信息的文件:

用户名:sjohhny@email1.com
值一:xx:xx:xx:xx:xx:xx
值二:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
值三:Sjohhny@email1.com@[xx:xx] [三个值的混合]

用户名:Vsamba@email3.com
值一:mm:mm:mm:mm:mm:mm
数值二:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm
值三:Vsamba@email3.com@[xx:xx] [三个值的混合]

用户名:Skrids@email2.com
值一:yy:yy:yy:yy:yy:yy
值二:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy
值三:Skrids@email2.com@[xx:xx] [三个值的混合]

用户名:Vconan@email4.com
值一:zz:zz:zz:zz:zz:zz
值二:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz
值三:Vconan@email4.com@[xx:xx] [三个值的混合]

首先,我想过滤掉所有以 S 开头的用户名信息,保留那些以 V 开头的用户名。之后,我想制作一个可以运行的 .sh 脚本的最终产品。我想做的是:

  1. 回显用户名
  2. 删除第三个值
  3. 在第一个和第二个值上使用开关 -One、Two 和 --Thanks -for -visiting 运行命令 Hello。

所以,我的 .sh 文件将与此类似

echo 用户名:Vsamba@email3.com
你好 -一个 mm:mm:mm:mm:mm:mm -Two: mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm --谢谢 -访问

echo 用户名:Vconan@email4.com
你好一 zz:zz:zz:zz:zz:zz -二:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz --Thanks -for -参观

我在 Youtube 上观看了关于 Sed 的整个视频系列,并阅读了这里的许多文章,试图想出一个可以生成我想要的脚本的脚本,但都失败了。你能告诉我如何编写这样的脚本吗?如果您推荐新用户可以阅读的有关 sed(或 Awk 或 Perl)的网站/参考资料,我也很乐意

请注意,“:”的数量对于值一和值二来说是静态的,这可能会以某种方式使用。我尝试使用它,但每次当我只要求一个值时我得到了两个值,但是你比我更知道如何利用这个事实。

抱歉问了这么长的问题!在没有自动化过程的情况下完成所有这些需要花费太多时间,而且我完全在 linux 世界(和一般的计算机,就此而言!)

ste*_*ver 5

由于您的文件结构,之间用空行记录,我建议使用awkperl段落模式。例如,使用

  • 一个或多个空行作为记录分隔符 RS=
  • 冒号空格或换行符作为字段分隔符 -F': |\n'

如果字段$2以以下开头,然后打印所需的信息V

awk -vRS= -F': |\n' '
  $2 ~ /^V/ {
    print "echo " $1 ": " $2; 
    print "Hello -One " $4, "-Two " $6 " --Thanks -for -visiting"; 
    print "";
  }' file
Run Code Online (Sandbox Code Playgroud)

给予

echo Username: Vsamba@email3.com
Hello -One mm:mm:mm:mm:mm:mm -Two mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm --Thanks -for -visiting

echo Username: Vconan@email4.com
Hello -One zz:zz:zz:zz:zz:zz -Two zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz --Thanks -for -visiting
Run Code Online (Sandbox Code Playgroud)