我在sed
尝试交换字词,而不是替换,因为这是我在Google搜索中一直找到的内容。< / p>
我不知道regex
是否出错了。我搜索了everything before a char
和everything after a char
,以便我获得regex
。
echo xxx,aaa | sed -r 's/[^,]*/[^,]*$/'
或
echo xxx/aaa | sed -r 's/[^\/]*/[^\/]*$/'
我收到了这个输出:
[^,]*$,aaa
或者这个:
[^,/]*$/aaa
我做错了什么?
答案 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 -r
,sed
与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'