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'