第一次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對空格極爲嚴格,有很多地方不能隨便加空格,否則會出錯。