1行から2種類の文字の間にある複数の文字列を抽出します。

1行から2種類の文字の間にある複数の文字列を抽出します。

1行のテキストで構成されるファイルがあります。 「#」と「@」記号の間の文字列を取得し、「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

Macで

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

関連情報