Я пытаюсь использовать простой однострочный Perl для следующего ввода:
@F7##########0/1
C4CTA6GCAAC56G67CTCA99C
+
b[[WZ56W]87X9HBB
@44FC6%%%%&&&&&&&1UP1
GTS4HY2IOMD3FCCA8DFLLLTG
+
]]^4YY23ZV\6`a8`^9^a
и т.п.
Я хотел бы, чтобы мой вывод выглядел так:
@F7##########0/1
C4CTA6GCAAC56G67CTCA99C
+F7##########0/1
b[[WZ56W]87X9HBB
@44FC6%%%%&&&&&&&1UP1
GTS4HY2IOMD3FCCA8DFLLLTG
+44FC6%%%%&&&&&&&1UP1
]]^4YY23ZV\6`a8`^9^a
и т.п.
Я хотел бы найти строку, начинающуюся с @
, и сохранить (группировать) оставшуюся часть строки в $1
. Затем я нахожу следующее вхождение +
и добавляю $1
в конец этой строки.
Я пробовал perl -pi -e "s%^@(.*)$\1\n(.*)$\2\n(\+)$\3\n%$1\n$2\n\+$1%mg" file.txt
, но после ^@(.*)$\1\n
ничего не нашел.
Наверняка для этого есть работающий однострочный лайнер. Однострочники Awk
, Sed
или tr
приветствуются, но изменения в file.txt
должны быть сделаны в строке, так как file.txt
большой и запись в другой файл нежелательна.
sed
— это именно то, что я искал изначально, когда пытался использоватьsed
. Однако я отказался отsed
, когда не смог сопоставить или заменить\n
. Это похоже на сложное регулярное выражение, не могли бы вы объяснить это для меня? 20.01.2012/^\+/
меня на мгновение бросило, так как без переключателя-r
+
не является особенным и обычно его не нужно экранировать. Однако, если он экранирован, это означает1 or more of the preceeding character or subexpression
, но в извращенной логике, поскольку^
является маркером места, а не символом, он возвращается к символу+
. 20.01.2012