好的,我将举例说明:
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上不支持它。
谢谢!
答案 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
创建了它们。