假设我有以下文件:
!@#$@##!#!!@#
!@#--@#%#
12asd
test
12349490
123end
Start12
M1dle
Sup3rASF
Secret
FS123Num
MyStuff
VeryVeryLongWord
WowThisIs123!
!myStuff:)
2014Kces
@88Random
Word Tab
AnyWordhere:P
我希望以一种方式过滤它,以便不显示末尾或开头有数字的所有单词。例如,我想要这个输出:
!@#$@##!#!!@#
!@#--@#%#
test
M1dle
Sup3rASF
Secret
FS123Num
MyStuff
VeryVeryLongWord
WowThisIs123!
!myStuff:)
@88Random
Word Tab
AnyWordhere:P
如何应用类似的过滤器来删除那些开头或结尾的后跟一个特殊字符,例如!,?,@等?
例如,生成此输出:
!@#$@##!#!!@#
!@#--@#%#
test
M1dle
Sup3rASF
Secret
FS123Num
MyStuff
VeryVeryLongWord
!myStuff:)
Word Tab
AnyWordhere:P
在最后一个例子中,@ 88Random和WowThisIs123!也被删除了。但是中间有数字的那些仍然存在,例如Sup3rASF和M1dle。
如果有人可以帮助我使用Linux工具来帮助我解决这两种情况,我很乐意,但请记住,它应该是单词独立的,因为我的文件很大,上面的字符串只是示例。
非常感谢。
答案 0 :(得分:2)
我希望以一种方式对其进行过滤,即不显示结尾或开头有数字的所有单词 如何应用类似的过滤器来删除那些开头或结尾的特殊字符,例如!,?,@等?
您可以使用egrep
:
egrep -v '^[0-9!?@]|[0-9!?@]$' file
答案 1 :(得分:2)
以下是使用perl
的选项:
perl -ne 'print unless /^\d|\d$/' file # removes numbers
!@#$@##!#!!@#
!@#--@#%#
test
M1dle
Sup3rASF
Secret
FS123Num
MyStuff
VeryVeryLongWord
WowThisIs123!
!myStuff:)
@88Random
Word Tab
AnyWordhere:P
或强>
perl -ne 'print unless /^[\d!?@]|[\d!?@]$/' file # removes numbers and some spl chars
test
M1dle
Sup3rASF
Secret
FS123Num
MyStuff
VeryVeryLongWord
Word Tab
AnyWordhere:P
虽然建议egrep
{{1}}就足够了。
答案 2 :(得分:1)
对于第一级过滤器,您可以使用以下简单的正则表达式:
perl -ne 'print if ! /^\d|\d$/' file
对于第二种类型的过滤器,您只需要在每一端添加[:punct:]*
。
perl -ne 'print if ! /^[:punct:]*\d|\d[:punct:]*$/' file
请注意标点字符类与数字分开的方式。那是因为你特别希望过滤掉带有数字的行,而不仅仅是用标点符号开头和结尾的行。
切换:
-n
:为输入文件中的每一行创建一个while(<>){..}
循环。 -e
:告诉perl
在命令行上执行代码。