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