Shell 打印空行的行號
寫一個 bash腳本以輸出一個文本文件 nowcoder.txt中空行的行號,可能連續,從1開始
示例:
假設 nowcoder.txt 內容如下:
a
b
c
d
e
f
你的腳本應當輸出:
3
5
7
9
10
題解
打印空行的行號,那么如何識別是不是空行 /^$/
sed -n '/^$/=' nowcoder.txt
-n 只顯示處理的行號,/^$/匹配上的空行,= 打印行號
awk '$0==""{print NR} ' nowcoder.txt
grep -n 顯示行號后,行號后面會添加:,所以我們需要刪除冒號
awk處理流程
1.讀入第一行,並將第一行的數據寫入$0,$1,$2等變量當中
2.根據條件,判斷是否需要進行后續的操作
3.完成所有操作和判斷
4.重復1~3直到所有數據處理完。
所以如果要修改分隔符,一定要在開始讀數據之前修改
grep -n '^$' nowcoder.txt| awk 'BEGIN{FS=":"}{print $1}'
grep -n '^$' nowcoder.txt | awk -F: '{print $1}'
grep -n '^$' nowcoder.txt |cut -d ':' -f 1
這里-F之前沒有遇見過的寫法,記錄下來。-F指定分隔符
1.sed識別出冒號替換成空
2.sed識別出冒號刪除 × sed的處理單位是一行,一整行都會被刪掉
grep -n '^$' nowcoder.txt| sed 's/\:/\ /g'
去掉空行
題目
寫一個 bash腳本以去掉一個文本文件 nowcoder.txt中的空行
示例:
假設 nowcoder.txt 內容如下:
abc
567
aaa
bbb
ccc
你的腳本應當輸出:
abc
567
aaa
bbb
ccc
題解
1.匹配空行直接刪除
sed '/^$/d' nowcoder.txt
2.或者匹配到空行之后反向輸出
sed -n '/[^$]/p' nowcoder.txt
grep -v '^$' nowcoder.txt
sed -n 輸出操作的行
p:打印匹配到的內容常與-n結合使用
正則部分: [^$] ^代表以后面跟着的字符為開頭,$代表以前面的字符為結尾;
^$聯合使用,中間不加任何字符數字,代表匹配空行;
[ ] 在shell正則中表示取反
3.找出不是空行的
awk '!/^$/{print $0}' nowcoder.txt
awk 'NF!=0{print}'
cat nowcoder.txt | awk NF
NF怎么有兩個意思啊?
NF(Field): 每一行($0)擁有的字段總數
NF只記錄有數據的行,可以理解成NF存在(true)則輸出?空行NF=0,0為假不會打印該行。
Shell 去掉所有包含this的語句
題目
寫一個 bash腳本以實現一個需求,去掉輸入中含有this的語句,把不含this的語句輸出
示例:
假設輸入如下:
that is your bag
is this your bag?
to the degree or extent indicated.
there was a court case resulting from this incident
welcome to nowcoder
你的腳本獲取以上輸入應當輸出:
to the degree or extent indicated.
welcome to nowcoder
說明:
你可以不用在意輸出的格式,包括空格和換行
題解
此題的要求是:去掉符合條件的語句,sed對行進行增刪改操作
這里匹配到的字符后面要加命令
sed '/this/d'
解法還可以是:打印出不符合條件的語句,grep過濾語句
找出一行內容中含有this的語句,這里可以不用正則
grep -v 'this'