다음 내용이 포함된 텍스트 파일이 있습니다.
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 string으로 /
끝나는 모든 줄을 제거합니다 .git
. 그런 다음 나머지 행부터 마지막 행까지 모든 항목을 삭제합니다 /
.
우리가 다루고 있는 텍스트에는 가 포함되어 있으므로 표현식에서 대체 구분 기호로 사용 /
합니다 .%
sed
abc
파일의 각 줄에서 추출 하려면 다음을 수행하십시오 .
$ sed -E -e 's%\.git/?$%%g' -e 's%.*/%%' file
abc
abc
abc
먼저 input 의 각 줄 끝에서 문자열(뒤에 a 가 올 수 있음)을 제거한 다음 .git
첫 번째 명령과 동일한 대체를 적용합니다./
sed