打印不包含标点符号的所有行


8

我想要一个可以打印不包含标点符号的所有行的正则表达式模式:

输入:

.This is line 1
This is ! line 2
This is line (3)
This is line 4

输出:(应为)

This is line 4

到目前为止我尝试过的是:

grep '[^[:punct:]]' file.txt

但是它会显示所有不是标点符号的字符。

Answers:


11

您将grep打印所有包含非标点字符的行。这与打印不包含标点字符的所有行不同。

对于后者,您需要-v切换(打印与模式不匹配的行):

grep -v '[[:punct:]]' file.txt

如果由于某种原因您不想使用该-v开关,则必须确保整行包含非标点符号:

grep '^[^[:punct:]]\+$' file.txt

+1谢谢。有没有不用-v开关的方法吗?
Hamed Kamrava 2014年

@HamedKamrava是的。请看我的编辑。
Joseph R.

@HamedKamrava出于好奇:您为什么要避免-v
伯恩哈德

我不能避免-v只是想了解更多:)
Hamed Kamrava 2014年

@HamedKamrava如果解决了您的问题,请不要忘记将此答案标记为“已接受”。
约瑟夫R.14年

1

在sed中,您可以执行以下操作:

sed '/[[:punct:]]/!d'

在awk中,您可以执行以下操作:

awk '!/[[:punct:]]/'


1

一个Perl

perl -nle 'print unless /\p{XPosixPunct}/' file

这将匹配-!“#$%&'()* +,。/ :; <=>?@ [\] ^ _` {|}〜,而unicode则考虑了标点和符号。

要么:

perl -nle 'print unless /\p{Punct}/' file

\p{Punct}仅匹配-!“#%&'()*,。/:;?@ [\] _ {},缺少$ + <=> ^`|〜,而unicode将其视为Symbols。

perl默认情况下使用POSIX语言环境。如果不使用perl,则应全部设置好LC_ALL=POSIX,因为不同的区域可以像SAA Chas 一样具有不同的标点符号¢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.