shell脚本和vim模式初步学习

来源:互联网 发布:传淘宝需要注意什么 编辑:程序博客网 时间:2024/05/21 00:46

第一次linux作业竟然花了不止4个小时而且只做出两道,真是受不了。
作业的题目如下

  • 如何将文本偶数行合并到奇数行?
    两种方式:
    1.使用s命令
    2.使用g和s命令组合

  • 请写出下面面模式的作用

:2,8s/\<four\>/4/g:/\(a[bc]\{2}\)[^abc]\+\1
  • 查看$HOME目录下的文件信息,将查询到的信息写入到文件,该文件以“log_用户名月_日”命名,保存到当前目录(shell脚本相同的目录)下。(注:用户名为当前正在使用的用户名)

一、偶数行合并到奇数行

方法一

g/\n/s// \t

合并前
这里写图片描述
合并后
这里写图片描述

原理: 首先标记所有换行符,然后通过s命令把换行符换成制表符,这时第二行就会合并到第一行,第二行的标记被删除,接着就会跑到第三行执行同样操作,如此下去遍完成了偶数行的合并。但又一个疑点,就是为什么将\n替换成” \t”后,从下面的结果可以看出空格的数量不一样??

方法二

:%s/\(^.*$\)\n\(^.*$\)/\1 \2/g

原理: 每次对两行操作,把两行中的第一行替换成空格。 ^.*$匹配一行字符。类似\1 、\2等。

\(^.*$\)  

去掉括号 ^.*$是一个匹配一行字符 的正则表达式,^和$ 分别匹配行首和行尾, . 匹配任意一个字符,* 匹配任意长度的任意字符。其中回车符\n不算做.和* 的字符范围内。\1选中的是第一个带有( 和 ) 的匹配该处正则表达式的内容;\2选中的是第二个带有( 和 ) 的匹配该处正则表达式的内容。这样看来,它是每次匹配两行字符,然后将\n提换成空格,替换后的内容就变成了
第一行 空格 第二行
即这里可以把“^.*$“` 替换为一行字符。
替换后的最终结果为
这里写图片描述

二、模式作用

:2,8s/\<four\>/4/g

原理: 将2-8行的所有four单词换成4,其中不包含fourteen和thirty-four等单词。
\< 匹配单词词首
> 匹配单词词尾

/\(a[bc]\{2}\)[^abc]\+\1

原理: \(a[bc]\{2}\)匹配 axxx xxx的长度为2,xxx的内容字符范围为[bc]即b或c。由于匹配比较短,我们可以列出所有可能: abc、abb、acc、acb
[^abc] 匹配除abc以外的任意一个字符,长度至少为1(+)
\1指的是这个地方有要匹配(a[bc]{2}),重复其内容。我们可以用这个匹配%s/(^.*$)\n/\1 \1/g检测,可以看出hello重复了两次
这里写图片描述
执行模式后的结果
这里写图片描述

所以整个模式的作用是 匹配 abbxxxabb 、abcxxxabc 、accxxxacc 、
acbxxxacb, xxx是 [^abc] 匹配除abc以外的任意一个字符串,因为有\+ 所以xxx长度至少为1。

三、shell脚本

查看$HOME目录下的文件信息,将查询到的信息写入到文件,该文件以“log_用户名月_日”命名,保存到当前目录(shell脚本相同的目录)下。(注:用户名为当前正在使用的用户名)

user=`whoami`mydate=$(date +%Y_%m_%d)filename="log_${user}_${mydate}"echo $filenamelsInfo=`ls -ail $HOME`echo $lsInfo>$filename

最后一行echo $lsInfo>$filename不能去掉echo,否则会出错,我觉得echo默认输出到屏幕,而这里我们把他输出到文件。
date +%Y_%m_%d是取得时间,其中”+”和date之间必须有空格,%y小写时只显示年的后两位 如2017只显示17;
小提醒: shell对空格极为严格,有很多地方不能随便加空格,否则会出错。

0 0
原创粉丝点击