我有两个字符串
internal func add(a: Int, b: Int) -> Int
add(a:b:)
如何将第一个字符串转换为第二个字符串。我可以在编程语言中做到这一点,但无法找到我需要的bash脚本的解决方案。
基本上需要的是在func
被修剪之前的任何事情,并且应该删除任何跟随(和包括)->
的内容,并且应该删除变量的类型。所有空间也应该去。
另外,我尝试使用正则表达式。我做了(?:.*func\s(.*)\s->.*)
从第一个字符串中取出add(a: Int, b: Int)
,但是,我不确定如何进一步消除这个字符串。
我最好使用awk或sed在bash中提供一些帮助,但正则表达式对我也有好处。
答案 0 :(得分:3)
以“oneliner”风格使用纯粹的bash:
#!/bin/bash
str="internal func add(a: Int, b: Int) -> Int"
[[ $str =~ .*func[[:space:]](.*\(.*:).*,[[:space:]]?(.*:).*(\)) ]] && str="${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}"
echo $str
即使字符串在逗号之后没有空格似乎是可选的,它也能正常工作。
答案 1 :(得分:2)
使用SED:
string='internal func add(a: Int, b: Int) -> Int'
sed -e '
s/^.*func \+//
s/ *\->.*$//
s/:[^,)]\+/:/g
s/[, ]//g
' <<< "$string"
s/^.*func \+//
删除^
之前的前func
}部分,func
和func
之后的空格; s/ *\->.*$//
删除后跟->
的空格以及字符串末尾后面的任何内容; s/:[^,)]\+/:/g
删除冒号后的类型名称; s/[, ]//g
通过删除逗号和空格来执行最终清理。答案 2 :(得分:1)
perl
regEx
中的解决方案
perl -lne 'print "$1$2$3)" if /^.*func (\w+)(\(\w+:).*, (\w+:).*\).*$/ ' <<<"internal func add(a: Int, b: Int) -> Int"
add(a:b:)
其中,$1
,$2
和$3
是捕获组,最后是打印)
的小黑客。
如果您的shell不支持here-strings(<<<)
,请执行
echo "internal func add(a: Int, b: Int) -> Int" | perl -lne 'print "$1$2$3)" if /^.*func (\w+)(\(\w+:).*, (\w+:).*\).*$/ '
add(a:b:)
答案 3 :(得分:-2)
这是问题的另一种sed
方法:
sed -r 's/^.*internal func *(\w+)\(([^)]*)\).*$/\1(\2)/;ta;b;:a;s/*(\w+:) *\w+,*/\1/g'