問題のあるsvn URLを含むリストを変換したいです。
cat list.txt
//svn.server.address/repos/project/module1/branches/issue-001-name1
//svn.server.address/repos/project/module2/branches/issue-002-name2
//svn.server.address/repos/project/module3/branches/issue-003-name3
...
newlist.txtに移動し、svnコマンドとフォルダ名を次のように追加して確認します。
svn co //svn.server.address/repos/project/module1/branches/issue-001-name1 issue-001-module1
svn co //svn.server.address/repos/project/module2/branches/issue-002-name2 issue-002-module2
svn co //svn.server.address/repos/project/module3/branches/issue-003-name3 issue-003-module3
...
私は同様のことを試しました:
eval $(awk -F'/branches/' '{print $2}' list.txt|awk -F'-' '{print "i="$1"-"$2}')
eval $(awk -F'/branches/' '{print $1}' list.txt|awk -F'/' '{print "j="$NF}')
name=$i"-"$j
awk '{print "svn co "$1" "n}' n=$name list.txt >newlist.txt
しかし、常に最後の変数を取得します。
ベストアンサー1
アークv1
チェックアウトするモジュールとして、最後のパス要素で3番目のパス要素を使用したいようです。この場合、awkで次のことができます。
awk -F/ '
{
split($NF, a, "-")
module=a[1] "-" a[2] "-" $6
print "svn co " $0 " " module
}' list.txt
説明する
split
$NF
配列はハイフンで区切られますa
(たとえばa[1] = issue
、、a[2] = 001
およびa[3] = name1
)。次に、最初の2つの要素をa
3番目のパス要素()に関連付けて、$6
必要なモジュール名を生成します。
アークv2
awk バージョンがフィールド区切り文字を正規表現として指定することをサポートしている場合は、次の簡単な代替方法を使用できます。
awk -F'[/-]' '{ print "svn co " $0 " " $8 "-" $9 "-" $6 }' list.txt
sed
GNU sedの代替案:
sed -r 's:(([^/]*/){5})([^/]+)/([^/]+)/(([^-]+-){2})(.*):\1\3/\4/\5\7 \5\3:'
説明する
(([^/]*/){5})
最初の5つのパス要素の場合、コメントの//
数は2つの要素です。([^/]+)
モジュールビット。([^/]+)
分岐ビット。(([^-]+-){2})
最初の2つのハイフンで区切られた要素issue-001-
(例:
すべての場合に出力
svn co //svn.server.address/repos/project/module1/branches/issue-001-name1 issue-001-module1
svn co //svn.server.address/repos/project/module2/branches/issue-002-name2 issue-002-module2
svn co //svn.server.address/repos/project/module3/branches/issue-003-name3 issue-003-module3