在单行中提取两种类型字符之间的多个字符串

在单行中提取两种类型字符之间的多个字符串

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

相关内容