在一个字符串中交换一个=的两侧

时间:2014-12-25 08:32:54

标签: string bash sed

我有一个看起来像这样的字符串:

755="Some String In Here"

我想交换这两个字段,这样就可以了:

"Some String In Here"=755

如何使用sed或其他命令行工具执行此操作?

4 个答案:

答案 0 :(得分:2)

通过awk,

$ echo '755="Some String In Here"' | awk -F= -v OFS="=" '{print $2,$1}'
"Some String In Here"=755
$ echo '755="Some String In Here"' | awk 'BEGIN{FS=OFS="="}{print $2,$1}'
"Some String In Here"=755

在BEGIN块中,我们将Field Separator和输出Field分隔符设置为=符号。最后,我们打印第2列加上输出字段分隔符值,加上第1列值。

答案 1 :(得分:2)

以下是sed

的完成方式
$ echo '755="Some String In Here"' | sed 's/\([^=]*\)=\(.*\)/\2=\1/'
"Some String In Here"=755

请注意,即使右侧的字符串包含=字符,此方法仍然有效:

$ echo '1="a==b"' | sed 's/\([^=]*\)=\(.*\)/\2=\1/'
"a==b"=1

答案 2 :(得分:1)

这样的东西
$ echo 755=\"Some String In Here\" | sed -r 's/(.*)=(.*)/\2=\1/'
"Some String In Here"=755

答案 3 :(得分:1)

带有正则表达式的纯Bash:

string='755="Some String In Here"'

[[ $string =~ ^([^=]+)=(.*) ]] && printf '%s=%s\n' "${BASH_REMATCH[2]}" "${BASH_REMATCH[1]}"

或使用参数扩展(这也适用于POSIX shell):

printf '%s=%s\n' "${string#*=}" "${string%%=*}"

如果有多个等号,那么工作正常:

$ var='a="b=c"'
$ [[ $var =~ ^([^=]+)=(.*) ]] && printf '%s=%s\n' "${BASH_REMATCH[2]}" "${BASH_REMATCH[1]}"
"b=c"=a
$ printf '%s=%s\n' "${var#*=}" "${var%%=*}"
"b=c"=a