我有由单行文本组成的文件。我试图获取“#”和“@”符号之间的字符串,并将它们作为换行符存储在“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