2016-01-14 78 views
0

交換的話我想交換話與周圍sed,不更換因爲這是我一直在尋找谷歌搜索。我不知道是不是regex我錯了。我搜索了everything before a chareverything after a char,這就是我如何得到regexsed的 - 用分隔符

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

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

我得到這樣的輸出:

[^,]*$,aaa 

或本:

[^,/]*$/aaa 

我在做什麼錯?

回答

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' 
+1

不sed'的'所有版本將把'\ +'沒有'-r'(但他們都應該把手'\ {1,\}'代替),以及Mac OS X上'-r'的等效選項是'-E'。 –

+0

如果我正在閱讀文件的行,該怎麼辦? 'sed ......

+1

@AdegokeA替換將應用於文件的所有行。 –

2

對於第一個樣品,你應該使用:

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符號;它應該在任何地方工作與支持(與Mac OS X或BSD sed-r與GNU sed-E)擴展正則表達式現代版本,你可以失去一些反斜槓和到位的*這是更精確地你後有什麼用+(和Parallels \{1,\}更簡潔):

echo xxx,aaa | sed -E 's/([^,]+),([^,]+)/\2,\1/' 
echo xxx/aaa | sed -E 's%([^/]+)/([^/]+)%\2/\1%' 
+0

值得記住的是'x +'是'xx *'的合成糖。 – potong