如何使用Linux命令工具删除字符串开头和结尾的数字?

时间:2014-07-02 15:20:09

标签: regex linux perl shell grep

假设我有以下文件:

!@#$@##!#!!@#
!@#--@#%#
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工具来帮助我解决这两种情况,我很乐意,但请记住,它应该是单词独立的,因为我的文件很大,上面的字符串只是示例。

非常感谢。

3 个答案:

答案 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在命令行上执行代码。