특정 패턴을 제외한 모든 것을 sed로 어떻게 바꿀 수 있나요?

특정 패턴을 제외한 모든 것을 sed로 어떻게 바꿀 수 있나요?

내 ::ID와 [ID2]를 제외한 모든 항목을 바꾸고 싶지만 sed를 사용하여 이 작업을 수행하고 일치 상태를 유지하는 방법을 실제로 찾을 수 없습니다. 어떤 제안이 있습니까?

예를 들어:

TRINITY_DN75270_c3_g2::TRINITY_DN75270_c3_g2_i4::g.22702::m.22702 [sample]

가지고 싶다:

TRINITY_DN75270_c3_g2_i4[sample]

어떤 제안이 있으십니까?

답변1

제공된 입력에 대해 이 sed표현식은 원하는 대로 작동하는 것으로 보입니다.

$ cat input
`>TRINITY_DN75270_c3_g2::TRINITY_DN75270_c3_g2_i4::g.22702::m.22702 [sample]`
$ sed 's/^.*::\([A-Z_0-9a-z]*\)::.*\[\(.*\)\].*/\1[\2]/' input
TRINITY_DN75270_c3_g2_i4[sample]

마법은 정규식 그룹과 두 개의 역참조를 사용하여 원하는 출력을 재구성하는 데 있습니다. 동화:

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  ^                        the beginning of the string
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
  ::                       '::'
  \(                       group and capture to \1:
    [A-Z_0-9a-z]*            any character of: 'A' to 'Z', '_', '0'
                             to '9', 'a' to 'z' (0 or more times
                             (matching the most amount possible))
  \)                       end of \1
  ::                       '::'
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
  \[                       '['
  (                        group and capture to \2:
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
  )                        end of \2
  \]                       ']'
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))

이것이 \1추출하려는 첫 번째 키이고 \2그 뒤의 대괄호 안에 있는 내용입니다. 그런 다음 Is를 다시 빌드하여 \1[\2]/원하는 출력을 생성합니다.

답변2

선택하다:

awk -F'::' '{ match($NF,/\[.+\]/); print $2 substr($NF,RSTART,RLENGTH) }' file

산출:

TRINITY_DN75270_c3_g2_i4[sample]

  • -F'::'- ::필드 구분자로 간주됩니다.

답변3

sed -e '
   s/::/\n/; s//\n/
   s/.*\n\(.*\)\n.*\(\[[^]]*]\).*/\1\2/
' data

::첫 번째와 두 번째 항목을 교체하여 ID를 표시합니다. 그런 다음 표시된 영역 + [...] 영역을 제외한 모든 항목을 제거합니다.

결과:

TRINITY_DN75270_c3_g2_i4[sample]

답변4

::구분 기호 + 사이에 두 번째 필드를 유지하고 싶다면 가능한 [sample]마지막 필드까지 해당 필드 앞뒤의 모든 항목을 제거하세요 .space

sed 's/^[^:]*::\([^:]*\)::.* /\1/'  

이것은 줄의 시작 부분부터 마지막 ​​부분까지 space( .*"탐욕스러운") 일치하고 교체 됩니다.오직첫 번째 "하위 표현식"(이스케이프된 대괄호로 표시됨)을 사용합니다.

역참조 및 하위 표현식에 대한 자세한 내용은 다음을 참조하세요.gnu.org의 설명.

관련 정보