Shell 打印空行的行號/去掉空行


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'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM