如何自动将HTML标记添加到sublime文本的.txt文件中的不同行?

时间:2017-05-19 14:11:42

标签: html regex file sublimetext3

所以我有一个几乎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标签。

3 个答案:

答案 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)

方法1

执行您尝试的操作的最佳方法可能是编写一些逐行读取文本文件的代码来更改代码。

假设n =行号

if((n-1)%6 === 0) // Question
else // Answer

方法2

从我所看到的有两种线格式。

  • 问题以数字开头,以新行/回车结束。
  • 答案以数字开头,以数字结尾,后跟新行/回车。

假设除了新行之外的任何字符都可以在问题或答案中

正则表达式识别所有问题:/^(\d+\s)(.+?(?<!\d))$/gm
正则表达式识别所有答案:/^(\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);
        }
    }
}