2012-11-29 60 views
1

Linux命令我有輸出文件的列表看起來像這樣:字符串操作 - 更換某些字符

folder/folder/folder/file_1 
    folder_1/folder/folder/file2 

我想格式化此輸出,因此滿足以下條件:

  • 最後一個斜槓(/)總是替換爲三個下劃線
  • 除最後一個斜槓之外的每個斜槓都被替換爲一個下劃線
  • 文件夾名稱中的任何下劃線被替換爲兩個下劃線
  • 任何強調的文件名是左的方式是

上面看起來像:

folder_folder_folder___file_1 
    folder__1_folder_folder___file2 

如果你還可以解釋你的解決方案,將是有益的。謝謝!

+1

這是這種功課嗎?這個練習似乎毫無意義 – Hasturkun

+0

不,我一般不會那麼熟悉bash或linux。它有一個目的 - 幫助我自動化一些事情,如果我手動完成,反而需要10-20分鐘。 – halexh

回答

2
# Assume each line in a variable called $value 
# Split the values up into dirname and basename 
val_dir="${value%/*}" 
val_base="${value##*/}" 

# Replace underscores in dirname with two underscores 
val_dir="${val_dir//_/__}" 
# Replace slashes in dirname with single underscore 
val_dir="${val_dir//\//_}" 

# Re-join dirname and basename with three underscores 
result="${val_dir}___${val_base}" 
1

一個awk的解決方案:

awk ' 
    BEGIN {FS="/";OFS="_"} 
    {for (i=1; i<NF; i++) gsub("_","__",$i); $NF="__" $NF; print} 
' 
0

這裏,你可以使用sed(與GNU sed的測試)做這件事:

<infile rev | sed -r 'h; s,_,__,g; G; s,[^/]+/([^\n]+)\n([^/]+/).*,\2\1,; :a; s,/,_,2; ta; s,/,___,' | rev 

輸出:

folder_folder_folder___file_1 
folder__1_folder_folder___file2 

rev可以更容易地解析它所做的一切是相反的線上的字符的順序。我會打破下面的sed腳本:

h;         # save a copy of PS in HS, prepare to replace folder underscores 
s,_,__,g;       # replace folder underscores 
G;         # append HS to PS 
s,[^/]+/([^\n]+)\n([^/]+/).*,\2\1,; # reorder into correct order 
:a; 
s,/,_,2;       # replace most/with _, leave the first alone 
ta; 
s,/,___,       # replace the first/with ___