我的数据:
Question Nr. 311
Main proteins are in the lorem ipsun
A Lorem RNA test
B Cells
C Metoclom
D Cells
E Muscles
Question Nr. 312
Main proteins are in the lorem ipsun
A Lorem
B Cells
C Metoclom
D Cells
E Muscles
...
想要的格式:
\item
Main proteins are in the lorem ipsun
A Lorem RNA test
B Cells
C Metoclom
D Cells
E Muscles
\item
Main proteins are in the lorem ipsun
A Lorem
B Cells
C Metoclom
D Cells
E Muscles
\item ...
我计划在新行中展示每个选项。
我的尝试:
sed s/Question Nr.*/\item/g
这应该取代所有具有问题编号[任何问题]
- 问题在于检测后面的内容,因为可以有很多选项,但选项的结尾是\n\n
换行符。
半阶段问题在这里:
\item
Main proteins are in the lorem ipsun
A Lorem RNA test
B Cells
C Metoclom
D Cells
E Muscles
\item
Main proteins are in the lorem ipsun
A Lorem
B Cells
C Metoclom
D Cells
E Muscles
其他挑战
- 单词大写,例如艾滋病病毒和核糖核酸在选项中;下面的一些解决方案在后面插入空行你好和护士长
你如何通过sed
/获得我想要的输出perl
?
答案1
和sed
:
sed 's/^Question Nr\..*/\\item/; s/^\([A-Z] .*\)/\n\1/' file
- 第一个
s///
替换Question Nr.
为\item
类似于sed
您问题中的命令。 - 第二个替换以大写字母 from
A
to开头的行Z
,但仅替换一个后跟空格的行。整行被自身替换为\1
换行符\n
。
输出:
\item
Main proteins are in the lorem ipsun
A Lorem
B Cells
C Metoclom
D Cells
E Muscles
\item
Main proteins are in the lorem ipsun
A Lorem
B Cells
C Metoclom
D Cells
E Muscles
答案2
tr
另一种使用+ 的方式sed
:
tr -s \\n <infile | sed '$!G;s/Question Nr.*/\\item/'
tr
挤压所有换行符,然后sed
将保留空间内容(空换行符)附加到除最后一行之外的每一行,替换Question Nr.*
为\item
.使用此方法,您将无法就地编辑文件。我选择tr
这里是因为它比正则sed
表达式更快(即使它不像sed
仅解决方案那么干净)
答案3
如果不需要sed
,Perl 的“段落模式”非常适合此目的。从man perlrun
:
-0[octal/hexadecimal]
specifies the input record separator ($/) as an octal or
hexadecimal number. [...]
The special value 00 will cause Perl to slurp files in paragraph
mode. [...]
因此, using-00
告诉 perl 将“行”定义为段落,它用作\n\n
行结束符。考虑到这一点,您可以执行以下操作:
$ perl -00pe 's/Question.*/\\item/; s/[A-Z] /\n$&/g;' file
\item
Main proteins are in the lorem ipsun
A Lorem
B Cells
C Metoclom
D Cells
E Muscles
\item
Main proteins are in the lorem ipsun
A Lorem
B Cells
C Metoclom
D Cells
E Muscles
Question
第一个替换运算符替换与字符串匹配的任何行\item
,第二个替换运算符在每个大写字母前添加一个换行符,后跟一个空格。
答案4
现在awk
:
awk '$1 ~ /[ABCDEM]/ {print $0"\n"} $1 ~ /Question/ {print "\\item"}' inputfile
如果该行以 A、B、C、D、E 或 M(表示 Main)开头,它将打印该行和一个额外的\n
.如果该行以“Question”开头,它只会打印\item
。