두 가지 유형의 구분 기호/구분 기호로 포함된 줄의 일부를 제거합니다.

두 가지 유형의 구분 기호/구분 기호로 포함된 줄의 일부를 제거합니다.

제가 작업 중인 대부분의 명령줄 도구에는 필드 구분 기호를 선택하는 기능이 있습니다. 그러나 시작할 구분 기호를 선택하고 처리 중인 각 줄에서 제거하려는 텍스트 세그먼트를 끝내려면 다른 구분 기호를 선택하고 싶습니다.

1text [blah blah blah] text number punctuation text text
2text text text
3text text (text) [blah blah blah] number text
4text <url> <email> text [blah blah blah] text

나는 이 줄에서 "어쩌고 저쩌고"를 모두 제거하고 싶습니다.

Blah에는 줄 바꿈, EOF 및 기타 불연속적인 내용과 "["를 제외한 모든 내용이 포함될 수 있습니다. 즉, 어떤 데이터에도 "[["가 있어서는 안 됩니다. (또한 "[blah[")도 있어서는 안 됩니다.

한 줄에 하나의 (선택 사항) [] 인스턴스만 있습니다. 따라서 2행의 경우 삭제할 내용이 없으며 이로 인해 일시정지, 중지 또는 오류가 발생해서는 안 됩니다.

나는 시작하는 '['가 있으면 ']'도 있을 것이라고 거의 100% 확신합니다. 그래도 확인해 보는 것이 좋을 것 같습니다.

다른 형태의 구두점이 있으므로 삭제를 시작하기 위해 영숫자가 아닌 콘텐츠를 찾는 것과 함께 사용하고 싶지 않습니다(예: 4행).

특정 지점에 두 개의 (이제 인접한) 공간을 함께 배치하지만 다른 지점에서 이중 공간을 제거하지 않는지 알아낼 수 있다는 보너스 포인트입니다.

awk나 sed를 사용해야 한다고 확신하지만, 일반 명령줄 도구를 통해 이를 수행하여 가능한 한 이식 가능하게 만드는 방법이 있다면 이상적일 것입니다.

또한, 현재 수행 중인 작업(regex/sed를 사용하는 경우)을 설명하면 다음과 같은 이유로 확실히 도움이 될 것입니다.


제안여기설명하다:

sed 's/^.*%\([^ ]*\) .*\$\([^$]*\)$/\1 \2/' infile

나는 이 말도 안되는 일을 사용하여 몇 가지 작업을 완료했습니다.

cat data | sed 's/^.*\[\([^ ]*\) .*\]\([^$]*\)$/\1 \2/'

그러나 "blah blah blah" 전체를 제거하는 대신 추가 개행 문자를 남깁니다.


두 개의 서로 다른 구분 기호와 함께 cut/awk/sed 사용

일반적인 의미에서 질문에 실제로 대답하지 않습니다(또는 적어도 읽은 후에는 알 수 없었습니다. 아마도 실패했을 수도 있습니다)내 거부분적으로), 그러나 (역시) 특별히 그 사람의 데이터에 맞춰진 것처럼 보입니다.

답변1

이것은 매우 간단합니다. 이러한 구분 기호는 필요하지 않으며 간단한 정규식을 사용하면 됩니다. 줄 끝까지 가능한 [한 많은 비 ]-OR 문자가 뒤따르는 시작 부분을 찾으세요 . [예를 들어:

  1. [[그렇지 않거나 뭔가 이상한 일이 벌어지고 있다는 것을 알고 있다면 :

    perl -pe 's/\[.+?\]//g' file
    

    이상한 일이 있을 수 있는 경우:

    perl -pe 's/\[[^\[\]]*\]//g' file
    
  2. sed

    sed  's/\[[^]]*\]//g' file
    

관련 정보