所以我有一个几乎10000行的.txt文件,每行都是单独的,按顺序排列。这是一个问题库。
格式是这样的
1 Question
2 Answer 1
3 Answer 2
4 Answer 3
5 Answer 4
6 Answer 5
7 Question
8 Answer 1
9 Answer 2
10 Answer 3
11 Answer 4
12 Answer 5
and so forth..
我的问题是 - 我想在文档中选择所有答案选项,并将HTML标记添加到文档中这些行的开头和结尾。如果不手动完成,我怎么能这样做?我还想只选择1,7,13行来选择问题,并在这些行的开头和结尾给它们单独的html标签。
答案 0 :(得分:2)
我假设你正在寻找这样的东西......
匹配确切模式
\d+\sQuestion(.*$)\s\d+\sAnswer(.*)\s\d+\sAnswer(.*)\s\d+\sAnswer(.*)\s\d+\sAnswer(.*)\s\d+\sAnswer(.*)
替换为HTML等效文件
<h1>$1</h1>\n<ol>\n<li>$2</li>\n<li>$3</li>\n<li>$4</li>\n<li>$5</li>\n<li>$6</li>\n</ol>
(regex101)
答案 1 :(得分:1)
印刷问题:
for i in `seq 1 6 30`; do sed -n "${i}p" sample.txt; done
输出
1 Question
7 Question
仅向问题添加HTML标记:
for i in `seq 1 6 30`; do sed -i -E "${i}s/(^.*)/<questiontag>\1<\/questiontag>/g" sample.txt; done
仅向答案添加HTML标记:
for i in `seq 1 6 30`; do qs=$(($i+1)); qe=$(($i+5)) ; sed -i -E "${qs},${qe}s/(^.*)/<answertag>\1<\/answertag>/g" sample.txt; done
sample.txt
的内容:
<questiontag>1 Question</questiontag>
<answertag>2 Answer 1</answertag>
<answertag>3 Answer 2</answertag>
<answertag>4 Answer 3</answertag>
<answertag>5 Answer 4</answertag>
<answertag>6 Answer 5</answertag>
<questiontag>7 Question</questiontag>
<answertag>8 Answer 1</answertag>
<answertag>9 Answer 2</answertag>
<answertag>10 Answer 3</answertag>
<answertag>11 Answer 4</answertag>
<answertag>12 Answer 5</answertag>
您需要使用30
之类的多个选项更改100000
,或者您可以将$(wc -l < sample.txt)
替换为for i in `seq 1 6 $(wc -l < sample.txt)`; do sed -n "${i}p" sample.txt; done
,这将返回sample.txt的行数。 e.g。
self.kwargs
答案 2 :(得分:0)
执行您尝试的操作的最佳方法可能是编写一些逐行读取文本文件的代码来更改代码。
假设n
=行号
if((n-1)%6 === 0) // Question
else // Answer
从我所看到的有两种线格式。
假设除了新行之外的任何字符都可以在问题或答案中
正则表达式识别所有问题:/^(\d+\s)(.+?(?<!\d))$/gm
正则表达式识别所有答案:/^(\d+\s)(.+)(\s\d+)$/gm
这假设没有问题以数字结尾。
我现在无法测试,但它应该类似于以下代码。
$file = 'my/file.txt'
$contents = file($file);
$result = [];
$regexes = [
'question' => [
'regex' => '/^(\d+\s.+?\s?(?<!\d))$/gm',
'replace' => '<div>$2</div>'
],
'answer' => [
'regex' => '/^(\d+\s)(.+)(\s\d+)$/gm',
'replace' => '<div>$2</div>'
]
];
foreach($contents as $line) {
foreach($regexes as $regex) {
if(preg_match($regex['regex'], $line)) {
$result[] = preg_replace($regex['regex'], $regex['replace'], $line);
}
}
}