如何将这些段落SED转为MCQ格式?

如何将这些段落SED转为MCQ格式?

我的数据:

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 Ato开头的行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

相关内容