내 ::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의 설명.