특정 정규식과 일치하는 파일 부분의 문자를 바꿔야 합니다. 정확하게 말하면 -
잘못된 마크다운 링크에서 공백을 제거해야 합니다 . 예를 들면 다음과 같습니다.
[This is my link](actual bad link.md)
다음과 같아야 합니다:
[This is my link](actual-bad-link.md)
(
정규식으로 시작하고 끝나는 항목을 sed에서 일치시킬 수 있지만 .md)
일치하는 표현식에서 공백만 바꾸도록 sed에 지시하는 방법을 모르겠습니다. 이를 수행할 수 있는 방법이 있습니까(아마도 awk와 같은 다른 명령줄 도구를 사용하여)?
감사해요.
(
편집: 최소화를 위해 및 .md)
사이의 모든 공백을 바꾸는 명령에 만족할 것입니다 -
.
답변1
한 줄에 하나의 인스턴스에 대해 중첩된 괄호 없이 및 다음 match
을 사용하여 유사한 작업을 수행 할 수 있습니다 substr
.
$ echo '[This is my link](actual bad link.md) other stuff' | awk '
match($0,/\([^)]*\.md\)/){
s = substr($0,RSTART,RLENGTH); gsub(/ /,"-", s);
print substr($0,1,RSTART-1) s substr($0,RSTART+RLENGTH)}
'
[This is my link](actual-bad-link.md) other stuff
GNU awk에는 일치하는 그룹을 배열로 캡처하는 비표준 확장 기능이 있지만 내 생각에는 여기서는 별 도움이 되지 않습니다.
루프를 통해 전역 교체를 수행할 수 있지만 match
아마도 Perl이 더 나은 선택일 것입니다.
$ echo '[This is my link](actual bad link.md) other stuff' | perl -pe '
s{(\(.*?\.md\))}{$1 =~ s/ /-/gr}ge
'
[This is my link](actual-bad-link.md) other stuff
답변2
두 개의 매개변수를 사용하는 flags 와 함께 명령을 사용할 수 있습니다 tr
. 첫 번째 매개변수는 대체할 문자이고 두 번째 매개변수는 대체할 문자입니다.tr
-t
cat data | tr -t " " "-"
이렇게 하면 모든 공백이 대체되지만 -
링크의 후반부를 꺼내는 것은 간단합니다. EDIT: Here is a
그렙 command to pull out whats between the
( )`
grep -Po '(?<=\().*(?=\))'
편집: 다음은 핵심 유틸리티를 사용하여 이를 수행하는 방법에 대한 예입니다. 스크립트를 단축할 수도 있습니다. 변수를 사용하여 읽기 쉽게 만들었습니다. grep
또는 이러한 명령 sed
중 하나를 awk
사용하여 동일한 출력을 생성할 수 있습니다.
data="[This is my link](actual bad link.md)"
r=$(echo $data | grep -Po '(?<=\().*(?=\))')
n=$(echo $data | grep -Po '(?<=\().*(?=\))' | tr -s ' ' '-')
t=$(echo $data | sed "s|${r}|${n}|")
echo $t