vi 편집기에서 대체

vi 편집기에서 대체

이라는 파일이 있습니다 foo.txt. 이 파일에는 다음 값이 포함되어 있습니다.

abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz

나는 이런 출력을 얻고 싶다

abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz

동일한 값/텍스트가 원래 값/텍스트 앞에 나타나야 합니다. 정규식을 사용하여 어떻게 이를 달성할 수 있나요?

%s/^[a-z_-]*./\1/g

위의 표현을 사용했는데 출력이 잘못되었습니다.

답변1

캡처 그룹:help /\(패턴과 일치하는 항목을 내부에 저장할 수 있습니다 . 그런 다음 \(...\)대체 항목에서(또는 나중에 패턴 자체에서) 일치 항목을 참조할 수 있습니다( \1첫 번째 그룹 \2등을 통해).

문제를 해결하는 한 가지 방법(여러 가지가 있음)은 .tar.gz확장자 앞에 파일 이름을 캡처하는 것입니다. 대체에는 캡처( \1), 공백, 원본 텍스트( \0, 또는 &)를 배치합니다.

:%substitute/\(.*\)\.tar\.gz$/\1 &/

또는 확장자 앞에 오는 항목을 일치시킨 다음(일치 종료를 위해 \ze) 복사할 수도 있습니다.

:%substitute/.*\ze\.tar\.gz$/& &/

시도에 문제가 있습니다.

  • 역참조를 사용했지만 \1아무것도 캡처하지 않았습니다.
  • [a-z_-]literal 과 일치 하지 않지만 .이는 귀하의 예에 나타납니다.
  • .최종 엔딩 (예 : ) 을 벗어날 수 있는 방법은 없습니다 \.. 이는 모든 문자와 일치합니다.
  • 부품 교체에는 중복이 없습니다. 텍스트를 추가하는 대신 효과적으로 제거할 수 있습니다.

답변2

.tar.gz가 항상 삭제되는 경우:

%s/^\(.*\).tar.gz/\1 \1.tar.gz/g

답변3

파일 이름: testt

abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz

주문하다

sed "s/[a-z]\{3\}\.\{0,1\}-\{0,2\}\.\{0,1\}[0-9]\{0,1\}\.\{0,1\}[0-9]\{0,1\}/& &/" test| sed "/[a-z]\{3\}\. /s/\.//1"

산출

abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz

답변4

반드시 그럴까요 vi?

그렇지 않은 경우 원하는 대로 수행될 수 있습니다(GNU 사용 xargs).

cat foo.txt | xargs -i basename {} .tar.gz | xargs -i echo {} {}.tar.gz

foo.txt파일은 어디에 있나요?

고쳐 쓰다.

$ cat foo.txt
abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz


$ cat foo.txt | xargs -i basename {} .tar.gz | xargs -i echo {} {}.tar.gz
abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz

위에서 말한 내용을 이해하지 못하셨나요?

관련 정보