텍스트 모드에서 특정 문자 제거

텍스트 모드에서 특정 문자 제거

Pandoc 형식의 citekeys가 포함된 텍스트가 포함된 Markdown 파일이 포함된 폴더가 있습니다 [@Name:2021]. 내 citekey에서 콜론을 제거하기로 결정하고 마크다운 파일에서 자동으로 제거하고 싶습니다. citekey는 다음 형식을 취할 수 있습니다.

[@Name:2021]
[@Name:2021, 10]
[@Name:Title]
[Vgl. @Name:2021]
[Vgl. @Name:2021, 20--30]

그래서 그들은 다음과 같아야 합니다:

[@Name2021]
[@Name2021, 10]
[@NameTitle]
[Vgl. @Name2021]
[Vgl. @Name2021, 20--30]

최근에 추가한 일부 citekey에는 더 이상 콜론이 포함되어 있지 않습니다. 물론 형식에 ^[Text]콜론이 포함되어 있어서 삭제하면 안되는 각주도 있을 수 있습니다.

모든 마크다운 파일의 인용 키에서 콜론을 자동으로 제거할 수 있는 명령줄 유틸리티 명령/스크립트가 있습니까? 당신의 도움을 주셔서 감사합니다!

답변1

Perl은 여기서 유용합니다. 대체 부분은 s///코드로 계산할 수 있습니다.

perl -pe 's/\[[^]]*@.+?\]/ ($cite = $&) =~ s{:}{}g; $cite /ge' file

산출

[@Name2021]
[@Name2021, 10]
[@NameTitle]
[Vgl. @Name2021]
[Vgl. @Name2021, 20--30]

출력에 만족하면 다음 명령을 사용하여 변경 사항을 파일에 다시 저장할 수 있습니다.

perl -i -pe ...

답변2

GNU를 사용하고 현재 디렉토리에 숨겨져 있지 않은 모든 파일에 in-place( ) 유형의 전역 대체를 적용합니다 sed.'s/regexp/replacement/g'-i

sed -i -- 's/\(\[[^]@]*@[^]:]*\):\([^]]*\]\)/\1\2/g' *
  • s/교체 시작
  • \(첫 번째 캡처 그룹 열기
    • \[리터럴과 일치[
    • [^]@]*문자가 아닌 문자 ]및 문자가 아닌 @문자 와 일치합니다.
    • @리터럴과 일치@
    • [^]:]*문자가 아닌 문자 ]및 문자가 아닌 :문자 와 일치합니다.
  • \)첫 번째 캡처 그룹 닫기
  • :리터럴과 일치:
  • \(두 번째 캡처 그룹 열기
    • [^]]*]문자가 아닌 문자와 일치
    • \]리터럴과 일치]
  • \)두 번째 캡처 그룹을 닫습니다.
  • /구분 기호 교체
  • \1\2캡처링 그룹을 포함하는 대체 문자열
  • /g최종 교체, g전역 교체

이 명령을 실행하기 전에 대상 디렉터리의 백업을 생성하거나 접미사가 붙은 원본 파일의 복사본을 유지 -i하도록 변경하세요 . 선택한 diff 도구를 사용하여 원본 파일을 결과와 비교하십시오.-i'.bak'.bak

답변3

변경하고 싶지 않은 줄이 로 시작하는 줄이라면 ^다음 명령이 효과가 있을 것 같습니다.

sed '/^\^/!s/://' file

답변4

사용 perl:

$ perl -lpe 'my($p1, $p2);
    substr($_, $p1, $p2-$p1) =~ s/(@[^:]+):/$1/
      while
        $p1 = 1+index($_, "[", $p2)
                 and
        $p2 = 1+index($_, "]", $p1);
' file
  • [$p1/$p2는 ]그 뒤의 a 위치입니다.
  • 그런 다음 substr()에 블록 시작 + 블록 길이가 전달되고 s/// 명령이 해당 블록에서 작동하며 현재 레코드 $_도 업데이트됩니다.

산출:

@Name2021]
[@Name2021, 10]
[@NameTitle]
[Vgl. @Name2021]
[Vgl. @Name2021, 20--30]

관련 정보