
次の内容を含むテキストファイルがあります。
https://git.centos.org/git/rpms/abc.git
https://git.centos.org/git/rpms/abc.git/
https://git.centos.org/git/rpms/abc
次のコマンドを実行すると、
reponame=$(echo $url | awk -F/ '{print $NF}' | sed -e 's/.git\/$//' | sed -e 's/.git//')
echo $reponame
私はその資格があります
アルファベット
で終わる行では失敗します.git/
が、他の2つの場合には機能します。
答え1
awkを使用して最後のフィールドを印刷する前に、末尾のスラッシュを削除する必要があります。それ以外の場合、最後のフィールドは空になります。
使用
echo "$url" | sed -e 's#/$##' -e 's/\.git$//' | awk -F / '{print $NF}'
でも
echo "$url" | sed -e 's#/$##' -e 's/\.git$//' -e 's#^.*/##'
ヒント:
sed
sedへの単一の呼び出しで複数のコマンドを実行できるため、fromsed
toパイピングが必要ない場合がありますsed
。どちらか一方sed -e 'cmd1' -e 'cmd2' ...
またはsed 'cmd1;cmd2;...'
両方が機能します。- パターン内でスラッシュをエスケープする必要がないように、コマンドに別の区切り文字を使用できます(私は区切り文字として
s
使用します)。sed
#
答え2
ファイルのすべての行に.git拡張子があるとします。
SEDなしのソリューションも提供されます。
SHW@SHW:/tmp/abc # cat a
https://git.centos.org/git/rpms/abc.git
https://git.centos.org/git/rpms/abc.git/
https://git.centos.org/git/rpms/abc
SHW@SHW:/tmp/abc # cat a | while read line; do basename $line .git; done
abc
abc
abc
答え3
私の考えでは問題はフィールド区切り記号命令したawk
。順序を変更してください。まず、コマンドを発行してsed
からawk
コマンドを発行してください。
reponame=$(echo $url | sed -e 's/.git\/$//' | sed -e 's/.git//' | awk -F/ '{print $NF}')
echo $reponame
答え4
$ sed -E -e '\%(\.git|/)$%d' -e 's%.*/%%' file
abc
上記のスクリプトは、最初にsed
入力からor文字列で/
終わるすべての行を削除します.git
。次に、残りの行から最後の行まですべての項目を削除します/
。
我々が扱っているテキストにはが含まれているので、式で代替区切り文字として使用/
します。%
sed
abc
ファイルの各行から抽出するには、次のようにします。
$ sed -E -e 's%\.git/?$%%g' -e 's%.*/%%' file
abc
abc
abc
まず、入力の各行の末尾から文字列(後にaが続くことがあります)を削除してから、最初のコマンドと.git
同じ置換を適用します。/
sed