부분 일치 정규식을 sed 또는 다른 도구로 교체

부분 일치 정규식을 sed 또는 다른 도구로 교체

특정 정규식과 일치하는 파일 부분의 문자를 바꿔야 합니다. 정확하게 말하면 -잘못된 마크다운 링크에서 공백을 제거해야 합니다 . 예를 들면 다음과 같습니다.

[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

관련 정보