
我正在嘗試列印包含學生姓名的文件。
muhaz:x:6541:113:AhmmedMuhaz Mohammed Kunhi Mulleria:/home/students/muhaz:/bin/bash
我需要我的輸出是這樣的:
muhaz:x:6541:113:Mulleria Mohammed Kunhi AhmmedMuhaz:/home/students/muhaz:/bin/bash
這是我嘗試過的,但它根本不起作用。
cat /etc/passwd | tail -n 20 | sed -r 's/.*[[:alpha:]]+([[:blank:]][[:alpha:]]+)*.*/\3\2\1/'
該命令應該是什麼樣子,有什麼問題?
入口文件:
rovshan:x:6532:113:Rovshan Ahmadli:/home/students/rovshan:/bin/bash
smith_63:x:6533:113:Smith Pataraprasitpon:/home/students/smith_63:/bin/bash
rashad:x:6534:113:Rashad Mahmudov:/home/students/rashad:/bin/bash
dilgamsh:x:6535:113:Dilgam Sharifov:/home/students/dilgamsh:/bin/bash
nlk_ns:x:6536:113:Nurlan Zhangali:/home/students/nlk_ns:/bin/bash
karpwiol:x:6537:113:WK:/home/students/karpwiol:/bin/bash
yigit123:x:6538:113:Mustafa Yigit Ersoz:/home/students/yigit123:/bin/bash
orxan123:x:6539:113:Orkhan Abiyev:/home/students/orxan123:/bin/bash
valiyev:x:6540:113:rufat valiyev:/home/students/valiyev:/bin/bash
muhaz:x:6541:113:AhmmedMuhaz Mohammed Kunhi Mulleria:/home/students/muhaz:/bin/bash
fatihebr:x:6542:113:Fatih Ocal:/home/students/fatihebr:/bin/bash
mrgo_g:x:6543:113:margarita gagaeva:/home/students/mrgo_g:/bin/bash
chrisd48:x:6544:113:Christian Hibestu:/home/students/chrisd48:/bin/bash
qwertinx:x:6545:113:Jakub Kaczmarczyk:/home/students/qwertinx:/bin/bash
grrronek:x:6546:113:Katarzyna Gro▒ska:/home/students/grrronek:/bin/bash
shahin:x:6547:113:Shahin Mehrabov:/home/students/shahin:/bin/bash
soufroud:x:6548:113:sofiane bouzroud:/home/students/soufroud:/bin/bash
jtrojak0:x:6549:113:Joanna Trojak:/home/students/jtrojak0:/bin/bash
jtrojak1:x:6550:113:Joanna Trojak:/home/students/jtrojak1:/bin/bash
markam:x:6551:113:Marcel Kami▒ski:/home/students/markam:/bin/bash
我想要實現的目標是:
shahin:x:6547:113:Mehrabov Shahin:/home/students/shahin:/bin/bash
jtrojak1:x:6550:113:Trojak Joanna:/home/students/jtrojak1:/bin/bash
yigit123:x:6538:113:Ersoz Yigit Mustafa:/home/students/yigit123:/bin/bash
答案1
您可以使用 GNU 嘗試此操作sed
,假設該字串是唯一的,如果不是,請對其進行註釋:
sed -E 's/:(\w+) (\w+) (\w+) (\w+):/:\4 \2 \3 \1:/' file
輸出:
muhaz:x:6541:113:Mulleria Mohammed Kunhi AhmmedMuhaz:/home/students/muhaz:/bin/bash
答案2
對於結構化數據,您可能會發現 Awk 等工具更適合,例如。
$ echo 'muhaz:x:6541:113:AhmmedMuhaz Mohammed Kunhi Mulleria:/home/students/muhaz:/bin/bash' | awk -F: '
BEGIN {OFS=FS}
{n=split($5,a,/ /); $5 = a[n]; for(i=2;i<n;i++) $5 = $5 " " a[i]; $5 = $5 " " a[1]}
{print}
'
muhaz:x:6541:113:Mulleria Mohammed Kunhi AhmmedMuhaz:/home/students/muhaz:/bin/bash
答案3
使用 GNU sed 我們可以這樣做:
$ sed -r '
s/:/\n/4;s//\n/4
s/\n(\S+)(.*\s)(\S+)\n/:\3\2\1:/
y/\n/:/
' file
透過保證不會被發現的唯一標記來標記第五個欄位。
然後在兩側標記所圍住的部分中,翻轉第一個和最後一個單字。
如果上述步驟沒有完成,請說它只有一個名字,例如中亞人的名字,然後刪除這些標記。
sed 預設列印模式空間。
答案4
使用 GNU awk 執行 gensub():
$ gawk 'BEGIN{FS=OFS=":"} {$5=gensub(/^(\S+)((\s+\S+)*\s+)(\S+)$/,"\\4\\2\\1",1,$5)} 1' file
rovshan:x:6532:113:Ahmadli Rovshan:/home/students/rovshan:/bin/bash
smith_63:x:6533:113:Pataraprasitpon Smith:/home/students/smith_63:/bin/bash
rashad:x:6534:113:Mahmudov Rashad:/home/students/rashad:/bin/bash
dilgamsh:x:6535:113:Sharifov Dilgam:/home/students/dilgamsh:/bin/bash
nlk_ns:x:6536:113:Zhangali Nurlan:/home/students/nlk_ns:/bin/bash
karpwiol:x:6537:113:WK:/home/students/karpwiol:/bin/bash
yigit123:x:6538:113:Ersoz Yigit Mustafa:/home/students/yigit123:/bin/bash
orxan123:x:6539:113:Abiyev Orkhan:/home/students/orxan123:/bin/bash
valiyev:x:6540:113:valiyev rufat:/home/students/valiyev:/bin/bash
muhaz:x:6541:113:Mulleria Mohammed Kunhi AhmmedMuhaz:/home/students/muhaz:/bin/bash
fatihebr:x:6542:113:Ocal Fatih:/home/students/fatihebr:/bin/bash
mrgo_g:x:6543:113:gagaeva margarita:/home/students/mrgo_g:/bin/bash
chrisd48:x:6544:113:Hibestu Christian:/home/students/chrisd48:/bin/bash
qwertinx:x:6545:113:Kaczmarczyk Jakub:/home/students/qwertinx:/bin/bash
grrronek:x:6546:113:Gro▒ska Katarzyna:/home/students/grrronek:/bin/bash
shahin:x:6547:113:Mehrabov Shahin:/home/students/shahin:/bin/bash
soufroud:x:6548:113:bouzroud sofiane:/home/students/soufroud:/bin/bash
jtrojak0:x:6549:113:Trojak Joanna:/home/students/jtrojak0:/bin/bash
jtrojak1:x:6550:113:Trojak Joanna:/home/students/jtrojak1:/bin/bash
markam:x:6551:113:Kami▒ski Marcel:/home/students/markam:/bin/bash
使用帶有參數-E
來支援 ERE 的 sed(例如 GNU 或 OSX/BSD sed):
$ sed -E 's/(([^:]*:){4})([^[:space:]:]+)(([[:space:]]+[^[:space:]:]+)*[[:space:]]+)([^[:space:]:]+)/\1\6\4\3/' file
rovshan:x:6532:113:Ahmadli Rovshan:/home/students/rovshan:/bin/bash
smith_63:x:6533:113:Pataraprasitpon Smith:/home/students/smith_63:/bin/bash
rashad:x:6534:113:Mahmudov Rashad:/home/students/rashad:/bin/bash
dilgamsh:x:6535:113:Sharifov Dilgam:/home/students/dilgamsh:/bin/bash
nlk_ns:x:6536:113:Zhangali Nurlan:/home/students/nlk_ns:/bin/bash
karpwiol:x:6537:113:WK:/home/students/karpwiol:/bin/bash
yigit123:x:6538:113:Ersoz Yigit Mustafa:/home/students/yigit123:/bin/bash
orxan123:x:6539:113:Abiyev Orkhan:/home/students/orxan123:/bin/bash
valiyev:x:6540:113:valiyev rufat:/home/students/valiyev:/bin/bash
muhaz:x:6541:113:Mulleria Mohammed Kunhi AhmmedMuhaz:/home/students/muhaz:/bin/bash
fatihebr:x:6542:113:Ocal Fatih:/home/students/fatihebr:/bin/bash
mrgo_g:x:6543:113:gagaeva margarita:/home/students/mrgo_g:/bin/bash
chrisd48:x:6544:113:Hibestu Christian:/home/students/chrisd48:/bin/bash
qwertinx:x:6545:113:Kaczmarczyk Jakub:/home/students/qwertinx:/bin/bash
grrronek:x:6546:113:Gro▒ska Katarzyna:/home/students/grrronek:/bin/bash
shahin:x:6547:113:Mehrabov Shahin:/home/students/shahin:/bin/bash
soufroud:x:6548:113:bouzroud sofiane:/home/students/soufroud:/bin/bash
jtrojak0:x:6549:113:Trojak Joanna:/home/students/jtrojak0:/bin/bash
jtrojak1:x:6550:113:Trojak Joanna:/home/students/jtrojak1:/bin/bash
markam:x:6551:113:Kami▒ski Marcel:/home/students/markam:/bin/bash