
한 줄의 텍스트로 구성된 파일이 있습니다. "#"과 "@" 기호 사이의 문자열을 가져와서 "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