정규식 구문에서 멈춤

정규식 구문에서 멈춤

저는 기본 쉘 스크립트를 작성 중이며 사용하기 전에 약간 편집해야 하는 데이터 파일을 받았습니다. 문제는 여러 줄, 심지어 단어까지 반복된다는 것입니다. 그래서 vim의 바꾸기 명령을 사용하거나 빠른 편집을 위해 sed를 사용하고 싶습니다. 문제는 기본적으로 "없음"으로 바꾸려는 경로와 일치하는 구현이 없다는 것입니다.

실제 파일은 더 크므로 일부만 붙여넣겠습니다. 그런데 다음과 같은 줄이 많이 있는 것 같습니다.

Category.php">category.php
Copyright.php">Copyright.php
Core.php">Core.php
Credit.php">Credit.php

문제는 해당 ">category.php부분이 필요하지 않기 때문에 제거하고 싶기 때문에 다음 정규식을 얻었습니다.

\">[A-z]+\.php[ ]+// 따라서 공백이 있으면 기본적으로 공백이 있는 문자 클래스를 추가합니다. 또한 문제가 발생할 경우를 대비해 첫 번째 큰따옴표를 피했지만 vim이나 sed 모두 해당 부분을 제거하지 못했습니다.

내가 실행한 실제 명령은 다음과 같습니다.

sed "s/\">[A-z]+.php//g"그리고 :%s/\">[A-z]+.php//gvim에서.

답변1

"를 구분 기호로 사용하여 cut 명령을 사용합니다.

cut -d\" -f1 input-file

답변2

sed와 vim 모두 정규 표현식에 실수가 있습니다. 다른 사람들이 몇 가지 좋은 대안을 제시했지만 저는 귀하가 제공한 명령이 작동하지 않는 이유와 해결 방법에 대해 설명하고 싶습니다.

당신의 명령:sed "s/\">[A-z]+.php//g"

먼저, 당신의캐릭터 클래스유효한 결말이 있어야 하며, 이 경우 [a-zA-Z].

둘째, +운영자의 특징 중 하나는확장 정규식(ERE), 기본적으로 활성화되어 있지 않습니다. 활성화하려면 및 -E// 플래그를 사용하세요 -r.--regexp-extended

이렇게 하거나 연산자 앞에 백슬래시를 붙일 수 있습니다 \+.

수정된 명령: sed 's/\">[a-zA-Z]\+.php//g'

당신의 명령::%s/\">[A-z]+.php//g

다시 말하지만, 캐릭터 클래스가 잘못되었습니다. [a-zA-Z]검색이 대소문자를 구분하지 않는다면 이는 중요하지 않을 수 있습니다.

~에 따르면vim 매뉴얼, +예상대로 작동하려면 연산자 앞에 백슬래시를 붙여야 합니다.

수정된 명령: :%s/\">[a-zA-Z]\+.php//g


노트:

  • sed에서 ERE를 사용하면 다음을 사용할 수 있습니다 \w.[a-zA-Z]
  • vim에서는 다음을 \a사용할 수 있습니다.[a-zA-Z]

답변3

아마도 정규식을 자세히 알아볼 필요는 없을 것입니다. 샘플 awk스크립트가 작업을 수행합니다.

awk -F\" '{print $1}' input_file

구분 기호 로 사용 "하고 첫 번째 토큰만 인쇄합니다.

답변4

다음과 같은 일부 XML 문서로 작업한다고 가정해 보겠습니다.

<?xml version="1.0"?>
<root>
  <node attr="Category.php">category.php</node>
  <node attr="Copyright.php">Copyright.php</node>
  <node attr="Core.php">Core.php</node>
  <node attr="Credit.php">Credit.php</node>
</root>

node... 값 속성이 있는 노드의 값을 삭제한다고 가정합니다 . 다음과 같이 사용할 수 있습니다.attrCategory.phpxmlstarlet

xmlstarlet edit --update '//node[@attr="Category.php"]' --value '' file.xml

또는 더 짧은 구문을 사용하면

xmlstarlet ed -u '//node[@attr="Category.php"]' -v '' file.xml

문자열은 속성 이 value 인 문서의 노드 집합과 일치하는 //node[@attr="Category.php"]XPath 쿼리입니다 .nodeattrCategory.php

이것은 생성됩니다

<?xml version="1.0"?>
<root>
  <node attr="Category.php"/>
  <node attr="Copyright.php">Copyright.php</node>
  <node attr="Core.php">Core.php</node>
  <node attr="Credit.php">Credit.php</node>
</root>

Vim 편집기에서 다음을 사용할 수 있습니다.

:%!xmlstarlet ed -u '//node[@attr="Category.php"]' -v ''

일치하는 노드 전체(값뿐만 아니라)를 삭제하려면 다음을 사용하세요.

xmlstarlet edit --delete '//node[@attr="Category.php"]'

또는

xmlstarlet ed -d '//node[@attr="Category.php"]'

xmlstarlet위의 명령 대신 .

관련 정보