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