shell腳本和vim模式初步學習

第一次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 $filename
lsInfo=`ls -ail $HOME`
echo $lsInfo>$filename

最後一行echo $lsInfo>$filename不能去掉echo,否則會出錯,我覺得echo默認輸出到屏幕,而這裏我們把他輸出到文件。
date +%Y_%m_%d是取得時間,其中”+”和date之間必須有空格,%y小寫時只顯示年的後兩位 如2017只顯示17;
小提醒: shell對空格極爲嚴格,有很多地方不能隨便加空格,否則會出錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章