한 줄에서 두 가지 유형의 문자 사이에 있는 여러 문자열을 추출합니다.

한 줄에서 두 가지 유형의 문자 사이에 있는 여러 문자열을 추출합니다.

한 줄의 텍스트로 구성된 파일이 있습니다. "#"과 "@" 기호 사이의 문자열을 가져와서 "Sequence.txt"에 개행 문자로 저장하려고 합니다.

예를 들어 다음과 같은 입력 라인이 있습니다.

#HelloMyName@#IsAdam@#NiceToMeetYou@

예상되는 출력은 다음과 같아야 합니다.

HelloMyName
IsAdam
NiceToMeetYou

나는 명령을 시도했습니다: 다음 코드 줄:

sed 's/.*#\(.*\)@.*/\1/' >> Sequence.txt

그러나 출력은 정확히 입력입니다.

#HelloMyName@#IsAdam@#NiceToMeetYou@

답변1

이것은 sed의 gnu 버전에서 작동합니다(기본적으로 모든 Linux에서).

echo -n '#HelloMyName@#IsAdam@#NiceToMeetYou@' | sed 's/#\([^@]*\)@/\1\n/g'

나에게 줘

HelloMyName
IsAdam
NiceToMeetYou

맥에서

echo -n '#HelloMyName@#IsAdam@#NiceToMeetYou@' | sed 's/#\([^@]*\)@/\1\'$'\n''/g'

이것은 echo와 동일한 작업 파일의 예입니다.

echo -n '#HelloMyName@#IsAdam@#NiceToMeetYou@'  > input.txt

sed 's/#\([^@]*\)@/\1\n/g' input.txt > sequence.txt

답변2

필드를 문자가 아닌 시퀀스로 정의 하려면 GNU awk( gawk)를 사용하세요 .FPAT#@

$ gawk '{$1=$1} 1' FPAT='[^#@]+' OFS='\n' file >> Sequence.txt
$ 
$ tail Sequence.txt 
HelloMyName
IsAdam
NiceToMeetYou

Perl에서도 유사한 접근 방식:

perl -lpe '$_ = join "\n", /[^#@]+/g' file >> Sequence.txt

답변3

이 순서는 다음과 같습니다.

[^#]*    # Accept some string of characters that are **not** the start character.
#        # Followed by an start character #
[^@]*    # Followed by an string of **not** ending characters.
@        # Followed by an ending character.

이것을 몇 번 반복하면 (거의) 전체 라인이 캡처됩니다.

이와 같이:

s/[^#]*#\([^@]\)@/\1\n/g

그러면 요구 사항에 따라 입력 행이 여러 행으로 변환됩니다.
유일하게 누락된 것은 남아 있을 수 있는 것을 지우는 것입니다.

sed 's/[^#]*#\([^@]*\)@/\1\n/g;s/\(.*\)\n.*$/\1/'

답변4

# @ # @.... 이 순서로 나타난다고 가정합니다.

$ perl -lne 'print for /#(.*?)@/g' file

POSIX SED:

° turn all @ to newlines, guaranteed to not be present.
° Then shave off upto the leading #.
° Thereby uncovering the element to be printed. 

.

$ sed -e '
   y/@/\n/
   s/^[^#]*#//
   P;D
' file

관련 정보