正则表达式 – 在unix / linux上的grep:如何替换或捕获文本?

所以我对正则表达式非常好,但是我在unix上遇到了一些问题.以下是我想知道如何做的两件事:

1)替换除字母,数字和下划线之外的所有文本

PHP中我会这样做:(效果很好)

preg_replace('#[^a-zA-Z0-9_]#','',$text).

在bash中我试过这个(成效有限);好像它不允许你使用全套正则表达式:

text="my #1 example!"
${text/[^a-zA-Z0-9_]/'')

我用sed尝试了它,但它似乎仍然有完整的正则表达集的问题:

echo "my #1 example!" | sed s/[^a-zA-Z0-9\_]//

我确定有一种方法可以用grep来做,但是当我尝试时它将它分成多行:

echo abc\!\@\#\$\%\^\&\*\(222 | grep -Eos '[a-zA-Z0-9\_]+'

最后我也尝试使用expr,但似乎对扩展正则表达式的支持非常有限……

2)捕获(多个)文本部分

在PHP中我可以做这样的事情:

preg_match('#(word1).*(word2)#',$text,$matches);

我不确定在* nix中怎么可能……

最佳答案
第1部分

你几乎就在那里,sed只需添加g修饰符,以便替换发生在全球,没有g,替换只会发生一次.

$echo "my #1 example!" | sed s/[^a-zA-Z0-9\_]//g
my1example
$

您的bash模式替换也犯了同样的错误:不全局替换:

$text="my #1 example!"

# non-global replacement. Only the space is delete.
$echo ${text/[^a-zA-Z0-9_]/''}
my#1 example!

# global replacement by adding an additional / 
$echo ${text//[^a-zA-Z0-9_]/''}
my1example

第2部分

捕获在sed中的工作方式与在PHP的正则表达式中相同:将模式括在括号中捕获:

# swap foo and bar's number using capturing and back reference.
$echo 'foo1 bar2' | sed -r 's/foo([0-9]+) bar([0-9]+)/foo\2 bar\1/'
foo2 bar1
$

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...