슬래시를 제거하려면 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 string으로 /끝나는 모든 줄을 제거합니다 .git. 그런 다음 나머지 행부터 마지막 ​​행까지 모든 항목을 삭제합니다 /.

우리가 다루고 있는 텍스트에는 가 포함되어 있으므로 표현식에서 대체 구분 기호로 사용 /합니다 .%sed

abc파일의 각 줄에서 추출 하려면 다음을 수행하십시오 .

$ sed -E -e 's%\.git/?$%%g' -e 's%.*/%%' file
abc
abc
abc

먼저 input 의 각 줄 끝에서 문자열(뒤에 a 가 올 수 있음)을 제거한 다음 .git첫 번째 명령과 동일한 대체를 적용합니다./sed

관련 정보