(macos终端)将正则表达式匹配的首字母更改为大写

时间:2019-03-15 15:34:24

标签: macos sed

好的,我将举例说明:

echo "x,y (fifo(x,y) , q(x) , fifo(z))" | sed 's/f\([a-z]*\)/F\1/g'

output: x,y (Fifo(x,y) , q(x) , Fifo(z))

因此,基本上,我想匹配每个以“(”结尾的单词(仅字母),并将该单词的首字母更改为大写。 我的代码并没有真正起作用,因为我也希望“ q(x)”也变成“ Q(x)”。

在我的示例中,我通过在sed命令中指定“ f”和“ F”来手动执行此操作(这意味着它不适用于“ q(x)”)-有一种方法可以重复执行每个字母都使用相同的命令?

GNU sed似乎有一种使字母大写的方法,但我认为Mac上不支持它。

谢谢!

3 个答案:

答案 0 :(得分:3)

使用\u的GNU sed将下一个字母转换为大写:

$ echo "x,y (fifo(x,y) , q(x) , fifo(z))" | sed -E 's/(\w)(\w*\()/\u\1\2/g'
x,y (Fifo(x,y) , Q(x) , Fifo(z))

您可以在macOS上安装GNU sed。具有任何POSIX awk的Othewrise:

$ cat tst.awk
{
    head = ""
    while ( match($0,/[[:alpha:]]+\(/) ) {
        head = head substr($0,1,RSTART-1) toupper(substr($0,RSTART,1)) substr($0,RSTART+1,RLENGTH-1)
        $0 = substr($0,RSTART+RLENGTH)
    }
    print head $0
}

$ echo "x,y (fifo(x,y) , q(x) , fifo(z))" | awk -f tst.awk
x,y (Fifo(x,y) , Q(x) , Fifo(z))

答案 1 :(得分:2)

这并非不可能,但MacOS上的sed很难做到。
为什么不改为使用ruby?(在MacOS上预装了afaik ruby,对吗?)
试试这个:

echo "x,y (fIfo(x,y) , q(x) , fifo(z))" | ruby -ne 'print $_.gsub(/([a-z]+)(?=\()/i){$1.capitalize}'

输出:

x,y (Fifo(x,y) , Q(x) , Fifo(z))

注意,我在回显中更改为fIfo,并在案例 i nsensitiveve中将i标志用于ruby的正则表达式。

答案 2 :(得分:2)

有趣的是,找到了一种macOS sed解决方案,该机制是使用循环将模式切换到行首,大写首字母,然后切换回。(使用{{ 1}}分开)
 太长了,因此我将跳过将其转换为单线的情况。
同样,它仅将模式中的首字母大写,而不会将其后的字母小写,因此严格来讲不是 capitalize 函数。但是,使用类似的机制也可以做到。

\r

输出:

echo "x,y (fifo(x,y) , q(x) , fifo(z))" | sed -e '
/^[a-z][a-z]*(/breplace
:circle
/[^a-zA-Z][a-z][a-z]*(/!bend
s/\(.*[^a-zA-Z]\)\([a-z][a-z]*(.*\)/\2\r\1/
:replace
s/^a/A/
s/^b/B/
s/^c/C/
s/^d/D/
s/^e/E/
s/^f/F/
s/^g/G/
s/^h/H/
s/^i/I/
s/^j/J/
s/^k/K/
s/^l/L/
s/^m/M/
s/^n/N/
s/^o/O/
s/^p/P/
s/^q/Q/
s/^r/R/
s/^s/S/
s/^t/T/
s/^u/U/
s/^v/V/
s/^w/W/
s/^x/X/
s/^y/Y/
s/^z/Z/
/\r/s/\(.*\)\r\(.*\)/\2\1/
bcircle
:end
'

如果有人想知道,我没有手动输入这些x,y (Fifo(x,y) , Q(x) , Fifo(z))
我用s创建了它们。