이라는 파일이 있습니다 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
위에서 말한 내용을 이해하지 못하셨나요?