因此,我有一个.txt文件,几乎有10000行,每一行都是分开的,并按顺序排列。这是个问题库。
格式是这样的
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标记。
发布于 2017-05-19 15:14:10
印刷问题:
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)
替换它,后者将返回sample.txt的行数。例如:
for i in `seq 1 6 $(wc -l < sample.txt)`; do sed -n "${i}p" sample.txt; done
发布于 2017-05-19 15:07:06
我猜你在找这样的东西..。
匹配精确模式
\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)
发布于 2017-05-19 15:11:56
方法1
进行尝试的最佳方法可能是编写一些逐行读取文本文件以更改代码的代码。
假设n
=行数
if((n-1)%6 === 0) // Question
else // Answer
方法2
据我所见,有两种行格式。
假设除新行之外的任何字符都可能在问答中。
标识所有问题的Regex:/^(\d+\s)(.+?(?<!\d))$/gm
识别所有答案的Regex:/^(\d+\s)(.+)(\s\d+)$/gm
这假设没有任何问题以数字结尾。
PHP代码示例
我现在不能测试这个,但是它应该类似于下面的代码。
$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);
}
}
}
https://stackoverflow.com/questions/44072286
复制相似问题