sed - 用分隔符交换单词

时间:2016-01-14 22:34:41

标签: regex bash sed

我在sed尝试交换字词,而不是替换,因为这是我在Google搜索中一直找到的内容。< / p>

我不知道regex是否出错了。我搜索了everything before a chareverything after a char,以便我获得regex

echo xxx,aaa | sed -r 's/[^,]*/[^,]*$/'

echo xxx/aaa | sed -r 's/[^\/]*/[^\/]*$/'

我收到了这个输出:

[^,]*$,aaa

或者这个:

[^,/]*$/aaa

我做错了什么?

2 个答案:

答案 0 :(得分:2)

对于第一个样本,您应该使用:

print([base(n, 4) for n in range(21)])

对于第二个示例,只需使用斜杠以外的字符作为分隔符:

echo xxx,aaa | sed 's/\([^,]*\),\([^,]*\)/\2,\1/'

您还可以使用echo xxx/aaa | sed 's%\([^/]*\)/\([^/]*\)%\2/\1%' 正式要求一个或多个:

\{1,\}

这使用最便携的echo xxx,aaa | sed 's/\([^,]\{1,\}\),\([^,]\{1,\}\)/\2,\1/' echo xxx/aaa | sed 's%\([^/]\{1,\}\)/\([^/]\{1,\}\)%\2/\1%' 表示法;它应该在任何地方工作对于支持扩展正则表达式的现代版本(sed与GNU -rsed与Mac OS X或BSD -E),您可能会丢失一些反斜杠并使用{代替sed代替+,更准确地说是你所追求的(并且更简洁地平行*):

\{1,\}

答案 1 :(得分:1)

使用sed,它将是:

sed 's#\([[:alpha:]]\+\)/\([[:alpha:]]\+\)#\2,\1#' <<< 'xxx/aaa'

如果将扩展posix正则表达式-r一起使用,则更易于阅读:

sed -r 's#([[:alpha:]]+)/([[:alpha:]]+)#\2/\1#' <<< 'xxx/aaa'

我正在使用两个子模式([[:alpha:]]+),它们可以包含一个或多个字母,并以/分隔。在替换部分中,我以相反的顺序\2/\1重新组装它们。另请注意,我使用#而不是/作为s命令的分隔符,因为/已经是输入数据中的字段分隔符。这使我们无法逃避正则表达式中的/

顺便说一句,您也可以使用awk,这很容易理解:

awk -F'/' '{print $2,$1}' OFS='/' <<< 'xxx/aaa'