1

私が持っているLinuxコマンドは、次のようなファイルのリストを出力します。

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

次の条件が満たされるように、この出力をフォーマットしたいと思います。

  • 最後のスラッシュ(/)は、常に3つのアンダースコアに置き換えられます
  • 最後のスラッシュを除くすべてのスラッシュは、1つのアンダースコアに置き換えられます
  • フォルダ名のアンダースコアは2つのアンダースコアに置き換えられます
  • ファイル名のアンダースコアはそのままにしておきます

上記は次のようになります。

    folder_folder_folder___file_1
    folder__1_folder_folder___file2

あなたがあなたの解決策を説明することもできればそれは役に立つでしょう。ありがとう!

4

3 に答える 3

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}"
于 2012-11-29T16:16:59.753 に答える
1

awkソリューション:

awk '
  BEGIN {FS="/";OFS="_"}
  {for (i=1; i<NF; i++) gsub("_","__",$i); $NF="__" $NF; print}
'
于 2012-11-29T18:48:20.440 に答える
0

sedでそれを行うことができる1つの方法は次のとおりです(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 ___
于 2012-11-29T19:38:18.080 に答える