用下划线替换空格(即“”)或换行符(即回车) - 特殊情况

用下划线替换空格(即“”)或换行符(即回车) - 特殊情况

我想在特殊情况下用下划线替换空格(即“”)或换行符(即回车符) - 当它们出现在两个特定字符串之间时。

我有 html 页面,我想在两个特定字符串之间出现空格和新行时用下划线替换它们。

例子:

lots of text...
page_5.html months ago


This is the password: 6743412 <http://website.com etc...
more text...

我想从上到下:

lots of text...
page_5.html months ago__This_is_the_password:_6743412_<http://website.com etc...
more text...

基本上,我只想在字符串ago<http

它是重复的 html,所以如果我能让它工作,那么以后提取修改后的文本将非常有帮助且容易。

使用 sed 或 awk 的东西最适合我。

答案1

假设您的意思是“在“几个月前”和“http://”之间”,此perl脚本会执行您想要的操作:

#! /usr/bin/perl

use strict;

my $join=0;

while(<>) {
    if (m/ ago$/) { $join=1 };
    if (m/http:\/\//) { $join=0 ; s/[[:blank:]]/_/g; };
    if ($join == 1) {
        s/\s/_/g;
        s/_(seconds|minutes|hours|days|weeks|months|years|ago_)/ $1/g;
    };
    print;
}

注意:我故意使用[[:blank::]]而不是\s在上面的第一个s///操作中使用,以便它只更改该行上的空格和制表符,而不是换行符。对于第二个替换,我希望它替换所有类型的空格,包括换行符(紧邻前面的空格以及andmonths ago之间的空格除外)。monthsago

输出:

lots of text...
page_5.html months ago___This_is_the_password:_6743412_<http://website.com_etc...
more text...

这也可以写成一行,使用perl -p

perl -p -e 'if (m/ ago/) { $join=1 }; if (m/http:\/\//) { $join=0 ; s/[[:blank:]]/_/g; }; if ($join == 1) {s/\s/_/g}; s/_(seconds|minutes|hours|days|weeks|months|years|ago_)/ $1/' speld.txt

答案2

Python 片段:

#!/usr/bin/env python3
import re
with open('file.txt') as f:
    f = f.read()
    spl = re.split(r'(\sago\n|<http://)', f)
    des = re.sub(r'\s', '_', spl[2])
    print(spl[0] + spl[1].replace('\n', '') + des + ''.join(spl[3:]), end='')

该文件被分成使用ago\n<http://作为分隔符的部分re.split。那么索引 2 处的值就是需要进行替换的所需部分。最后以所需的图案打印文件。

答案3

珀尔:

perl -0777 -pe 's{(?<=\bago\b)(.+)(?=<http)}{ ($repl=$1) =~ s/\s/_/g; $repl }sge' file

笔记:

  • -0777将文件合并为单个字符串
  • “outer”s///命令找到所有要修改的子字符串
  • “inner”s///命令用下划线替换所有空格。

答案4

使用 vim,终端中的一个命令即可完成:

vim -c '%s/ ago\n*/ ago__/g|wq' original.txt

origin.txt 被修改,所以确保先备份!

相关内容