Bash脚本删除文件中的一行

Bash脚本删除文件中的一行,bash,awk,sed,Bash,Awk,Sed,我有一个文件,它有多行 例如: a ab# ad. a12fs b c ... 如果行中包含符号或数字,我想使用sed或awk删除该行。(例如,我想删除:ab#,ad.,a12fs…行) 或者换句话说,我只想保留包含[a-z][a-z]的行 我知道如何删除号码行 sed '/[0-9]/d' file.txt 但我不知道如何删除符号行 或者有什么简单的方法可以做到这一点呢?grep也很好用,甚至更简单:只需做相反的事情:保留你感兴趣的行,这更容易定义 grep -i '^[a-z]*$' f

我有一个文件,它有多行

例如:

a
ab#
ad.
a12fs
b
c
...
如果行中包含符号或数字,我想使用
sed
awk
删除该行。(例如,我想删除:ab#,ad.,a12fs…行) 或者换句话说,我只想保留包含[a-z][a-z]的行

我知道如何删除号码行

sed '/[0-9]/d' file.txt
但我不知道如何删除符号行


或者有什么简单的方法可以做到这一点呢?

grep也很好用,甚至更简单:只需做相反的事情:保留你感兴趣的行,这更容易定义

grep -i '^[a-z]*$' file.txt
(匹配只包含字母和空行的行,并且
-i
选项使grep不区分大小写)

要同时删除空行,请执行以下操作:

grep -i '^[a-z]+$' file.txt
使用Windows文本文件时要小心,因为行尾有一个回车符,所以根据grep版本的不同,没有任何匹配项(在Windows上测试,可以正常工作)

但以防万一:

grep -iP '^[a-z]*\r?$'

(请注意,启用perl表达式或
\r
的p选项不被识别)

grep也可以很好地工作,甚至更简单:只需做相反的事情:保留您感兴趣的行,这更容易定义

grep -i '^[a-z]*$' file.txt
(匹配只包含字母和空行的行,并且
-i
选项使grep不区分大小写)

要同时删除空行,请执行以下操作:

grep -i '^[a-z]+$' file.txt
使用Windows文本文件时要小心,因为行尾有一个回车符,所以根据grep版本的不同,没有任何匹配项(在Windows上测试,可以正常工作)

但以防万一:

grep -iP '^[a-z]*\r?$'

(请注意,启用perl表达式或
\r
的p选项无法识别)

您可以使用此
sed

sed '/^[A-Za-z0-9]\+$/!d' file
(或)


您可以使用此
sed

sed '/^[A-Za-z0-9]\+$/!d' file
(或)

要保留空行,请执行以下操作:

grep '^[[:alpha:]]*$' file
sed '/[^[:alpha:]]/d' file
awk '/^[[:alpha:]]*$/' file
grep '^[[:alpha:]]+$' file
sed -E -n '/^[[:alpha:]]+$/p' file
awk '/^[[:alpha:]]+$/' file
要删除空行,请执行以下操作:

grep '^[[:alpha:]]*$' file
sed '/[^[:alpha:]]/d' file
awk '/^[[:alpha:]]*$/' file
grep '^[[:alpha:]]+$' file
sed -E -n '/^[[:alpha:]]+$/p' file
awk '/^[[:alpha:]]+$/' file
要保留空行,请执行以下操作:

grep '^[[:alpha:]]*$' file
sed '/[^[:alpha:]]/d' file
awk '/^[[:alpha:]]*$/' file
grep '^[[:alpha:]]+$' file
sed -E -n '/^[[:alpha:]]+$/p' file
awk '/^[[:alpha:]]+$/' file
要删除空行,请执行以下操作:

grep '^[[:alpha:]]*$' file
sed '/[^[:alpha:]]/d' file
awk '/^[[:alpha:]]*$/' file
grep '^[[:alpha:]]+$' file
sed -E -n '/^[[:alpha:]]+$/p' file
awk '/^[[:alpha:]]+$/' file

/[^[:alpha:][]/
表示“不包含非字母字符”,这是一种双重否定,因此最好尽可能避免使用。@Ed Morton,我在您的回答中看到,与此解决方案相比,您是如何处理
awk
解决方案的,您的方法当然是有意义的。这就是说,这个解决方案怎么会有问题,或者你能给我指出一个方向,我可以读到为什么我应该避免使用双重否定。谢谢。双重否定是很难理解的,无论是在编程语言中还是在口语中,而否定的否定是正的(--1)=1,所以无论何时面对一个编写代码,你都应该花时间找出正的条件是什么,然后写出来。要扩展它,请不要以负的方式写入变量(例如,
databaseNotAvailable
),因为这样几乎可以保证您必须在某个地方写入双重负数(例如,
!databaseNotAvailable
)。与
相比!数据库可用
数据库可用
)。对不起,我不知道有什么好的参考资料。
从不写
有点强-我的意思是
避免写
。有时候,创建一个措辞消极的变量是有意义的,在做之前先考虑一下。@Ed Morton,谢谢你花时间解释。当你说“或用口语”时,我不得不笑,因为我差点说。。。“为什么我应该避免使用双重否定”。。。除了我小时候英语老师告诉我的以外。:)感谢您的贡献,我一直在从您的答案中学到更多。
/[^[:alpha:][]/
表示“不包含非字母字符”,这是一种双重否定,因此最好尽可能避免使用。@Ed Morton,我在您的回答中看到,与此解决方案相比,您是如何处理
awk
解决方案的,您的方法当然是有意义的。这就是说,这个解决方案怎么会有问题,或者你能给我指出一个方向,我可以读到为什么我应该避免使用双重否定。谢谢。双重否定是很难理解的,无论是在编程语言中还是在口语中,而否定的否定是正的(--1)=1,所以无论何时面对一个编写代码,你都应该花时间找出正的条件是什么,然后写出来。要扩展它,请不要以负的方式写入变量(例如,
databaseNotAvailable
),因为这样几乎可以保证您必须在某个地方写入双重负数(例如,
!databaseNotAvailable
)。与
相比!数据库可用
数据库可用
)。对不起,我不知道有什么好的参考资料。
从不写
有点强-我的意思是
避免写
。有时候,创建一个措辞消极的变量是有意义的,在做之前先考虑一下。@Ed Morton,谢谢你花时间解释。当你说“或用口语”时,我不得不笑,因为我差点说。。。“为什么我应该避免使用双重否定”。。。除了我小时候英语老师告诉我的以外。:)谢谢你的贡献,我一直在从你的答案中学到更多。