加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 如何删除非ascii字符并在非ascii字符使用Perl单行

发布时间:2020-12-14 06:00:21 所属栏目:百科 来源:网络整理
导读:Hi Stack Overflow社区, 我有以下问题. 我得到了这个名为bad的文件,其中包含以下内容: SPAM EATER PO BOX 5555 FAKE STREETFOO BAR ??PO BOX 1234 LOLLERCOASTER VILLAGELOL MAN PO BOX 9876 NEXT DOOR 我想从中删除非ascii字符(在第二个记录的第二列的开头
Hi Stack Overflow社区,

我有以下问题.

我得到了这个名为bad的文件,其中包含以下内容:

SPAM EATER       PO BOX 5555          FAKE STREET
FOO BAR          ??PO BOX 1234         LOLLERCOASTER VILLAGE
LOL MAN          PO BOX 9876          NEXT DOOR

我想从中删除非ascii字符(在第二个记录的第二列的开头),以便获得一个没有奇怪字符并且所有列都对齐的文件.另外,有一个要求是使用Perl单线程实现这一点 – 因此,不能使用awk,sed或类似命令.我尝试了以下内容,但在第三列中缩短了一个空格:

$perl -plne 's/[^[:ascii:]]//g' bad > bad.clean

$cat bad.clean
SPAM EATER       PO BOX 5555          FAKE STREET
FOO BAR          PO BOX 1234         LOLLERCOASTER VILLAGE
LOL MAN          PO BOX 9876          NEXT DOOR

我也试过使用相同的单行,但这次用空格替换非ascii字符.在这种情况下,记录最后在第二列中有两个额外的空格,在第三列中有一个额外的空格:

$perl -plne 's/[^[:ascii:]]/ /g' bad > bad.clean.space

$cat bad.clean.space
SPAM EATER       PO BOX 5555          FAKE STREET
FOO BAR            PO BOX 1234         LOLLERCOASTER VILLAGE
LOL MAN          PO BOX 9876          NEXT DOOR

不知何故,非ascii字符似乎占用2个字节而不是一个 – 这是正确的,还是我错过了什么?

预期的输出是这样的:

SPAM EATER       PO BOX 5555          FAKE STREET
FOO BAR          PO BOX 1234          LOLLERCOASTER VILLAGE
LOL MAN          PO BOX 9876          NEXT DOOR

有没有办法,使用Perl单线程,以获得预期的结果?我想到了一种在删除非ascii字符后添加一个空格的方法,在已经进行更改的字段中,但我找不到这样做的方法.此外,非ascii字符可以出现在任何字段上,而不仅仅出现在第二个字段中.

顺便提一下,一些可能有用的信息:这是一台运行Perl v5.8.8的AIX机器.

谢谢!

编辑:

至于@ThisSuitIsBlack没有提及,有两个非ascii字符.因此,我想我只想在该字段的末尾添加一个空格,如果该命令至少删除了一个非ascii字符.有没有办法让这个额外的空间包含在同一个句子中,所以它也可以作为一个单行程来完成?

编辑:

在查看了大量数据之后,我可以看出非ascii字符始终显示为成对,并且原始文件中的下一个字段(在运行单行之前)与其他列相比总是在右边一个空格.所以,我正在改变这个问题的标题以符合要求:Perl one-liner删除非ascii字符并在非ascii字符所在的字段中追加一个空格

解决方法

取出2个非ascii,在字段后添加一个空格.
使用非ascii和3个空格作为分隔符对.

#  s/[^[:ascii:]]{2}(.*?[ ]{3})/$1 /g

 [^[:ascii:]]{2} 
 ( .*? [ ]{3} )

Perl测试用例

$/ = undef;
$str = <DATA>;
$str =~ s/[^[:ascii:]]{2}(.*?[ ]{3})/$1 /g;
print $str;

__DATA__
SPAM EATER       PO BOX 5555          FAKE STREET
FOO BAR          ??PO BOX 1234         LOLLERCOASTER VILLAGE
LOL MAN          PO BOX 9876          NEXT DOOR

输出>>

SPAM EATER       PO BOX 5555          FAKE STREET
FOO BAR          PO BOX 1234          LOLLERCOASTER VILLAGE
LOL MAN          PO BOX 9876          NEXT DOOR

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读