用于将字符串从一种形式转换为另一种形式的Shell脚本

时间:2016-12-08 12:14:51

标签: bash shell awk sed

我有两个字符串

internal func add(a: Int, b: Int) -> Int
add(a:b:)

如何将第一个字符串转换为第二个字符串。我可以在编程语言中做到这一点,但无法找到我需要的bash脚本的解决方案。

基本上需要的是在func被修剪之前的任何事情,并且应该删除任何跟随(和包括)->的内容,并且应该删除变量的类型。所有空间也应该去。

另外,我尝试使用正则表达式。我做了(?:.*func\s(.*)\s->.*)从第一个字符串中取出add(a: Int, b: Int),但是,我不确定如何进一步消除这个字符串。

我最好使用awk或sed在bash中提供一些帮助,但正则表达式对我也有好处。

4 个答案:

答案 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}部分,funcfunc之后的空格;
  • 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'