スラッシュを削除するには sed を使用します。

スラッシュを削除するには sed を使用します。

次の内容を含むテキストファイルがあります。

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#^.*/##'

ヒント:

  • sedsedへの単一の呼び出しで複数のコマンドを実行できるため、from sedtoパイピングが必要ない場合があります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

関連情報