sed를 사용하여 경로 문자열에서 마지막 /를 제거합니다.

sed를 사용하여 경로 문자열에서 마지막 /를 제거합니다.

sed를 사용하여 다음 디렉터리 구조의 마지막 /를 대체하려고 시도했지만 성공하지 못했습니다. 어떤 제안이 있으십니까?

입력은 이고 /tmp/ABC/Dirs/출력은 다음과 같아야 합니다./tmp/ABC/Dirs

echo " /tmp/ABC/Dirs/"  | sed -r "s/\/(?:[a-zA-Z0-9])/g"

답변1

sed/bash여기서는 다소 과도한 것처럼 보입니다. Korn 셸(및 POSIX가 이 유틸리티에 대해 Korn 셸 기능을 지정했기 때문에 모든 POSIX 호환 셸과 같은 유사한 셸 sh) 에서 후행을 직접 제거할 수 있습니다 .

$ foo=/tmp/ABC/Dirs/
$ echo "${foo%/}"
/tmp/ABC/Dirs

답변2

with 을 사용하려면 sed다음을 수행하십시오.

file=/any/path
sed '$s|/$||' << EOF
$file
EOF

즉, 에 저장된 경로의 마지막(첫 번째) 줄 끝(두 번째)에 있는 문자를 삭제합니다 /. 일부 구현의 경우 개행 문자가 아닌 가장 큰 문자 시퀀스의 크기(바이트)는 시스템 호출 인수에서 지원되는 경로의 최대 크기보다 크지 않은(일반적으로 짧은) 것으로 가정됩니다.$$$filesed$fileLINE_MAX

/또는 의 특별한 경우에는 //후행을 제거하는 것이 /이상적이지 않을 수 있습니다. /예를 들어 모든 후행 /foo/bar///.

그럼 어쩌면 더고급의보다 합리적인 이유 sed는 다음과 같습니다.

sed '
  ${
    s|\([^/]\)/*$|\1|
    s|^////*|/|
    1b
    s|/*$||
  }' << EOF
$file
EOF

즉, //그대로 유지하고 ///조화 로 바꾸되 /////조화가 되십시오.//foo//foo$'foo\n//'$'foo\n'

(?:...)이는 확장 정규식 연산자( 이 GNU 특정 옵션을 사용하여 GNU로 식별됨) 가 아닌 Perl 정규식 연산자입니다 .sed-r

답변3

내 댓글로 질문에 답한 첫 번째 사람입니다 s/\/$//.

그날 다른 사람이 더 포괄적인 답변을 제공할 시간을 갖게 될 것입니다.

그래서 오늘 – 며칠 후 – "Peer Pressure" 동상이 목록에서 사라지기를 원하기 때문에 중복된 답변을 게시합니다.

sed -e s./$..g   # You can golf the quotes and the "\" here

그러니 모든 지지자들은 이번에는 -3까지 반대 투표를 해주세요 :)

답변4

sed 대신 Perl을 사용할 수 있습니다.

echo "/tmp/ABC/Dirs/" | perl -pne  "s/\/$//g"

산출

/tmp/ABC/Dirs

관련 정보