Linux Bash中的模式匹配

时间:2015-05-13 16:03:17

标签: linux bash sed

有人知道如何删除模式" @TechCrunch:"在Linux下的sed下面的str?

str="0,RT @TechCrunch: The Tyranny Of Government And Our Duty Of Confidentiality As Bloggers."

所以期望的输出将是:

"0,RT The Tyranny Of Government And Our Duty Of Confidentiality As Bloggers."

我尝试了许多方法,但没有人工作,例如:

echo $str | sed 's/@[a-zA-Z]*\ //'

3 个答案:

答案 0 :(得分:2)

sed(或任何其他外部工具)用于shell变量中已经存在的单行是非常低效的。更容易让shell自行更换。

#!/bin/bash
#      ^- must be /bin/bash, not /bin/sh, for extglobs to be available

shopt -s extglob # put this somewhere early in your script to enable extended globs

str="0,RT @TechCrunch: The Tyranny Of Government And Our Duty Of Confidentiality As Bloggers."
echo "${str//@+([[:alpha:]]): /}"

这使用extglob语法通过内置shell模式匹配提供更强大的模式匹配; +(foo)是与正则表达式(foo)+等效的extglob。

答案 1 :(得分:1)

你很接近 - 只是错过了:

perl -pe 's/@\w*:\s//i'

sed

sed -e 's/@[a-z]: //i'

答案 2 :(得分:0)

:[a-zA-Z]不匹配。此外,没有必要反斜杠空间。

sed 's/@[a-zA-Z]*: //'