regex - 如何删除非 ascii 字符并在非 ascii 字符使用 Perl 单行符的字段中附

嗨 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 one-liner 实现这一点有一个要求 - 因此,不能使用 awksed 或类似的命令.我尝试了以下方法,但在第三列中缩短了一个空格:

$ 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 个字节而不是 1 个 - 这是正确的,还是我遗漏了什么?

预期的输出是这样的:

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

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

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

谢谢!


编辑:

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


编辑:

查看大量数据后,我可以看出非ascii字符总是成对出现,并且原始文件中的下一个字段(在运行单行之前)始终是右侧一个空格其他列。因此,我正在更改此问题的标题以符合要求:Perl one-liner to remove non-ascii characters and append a space in the field where the non-ascii characters are

最佳答案

取出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

关于regex - 如何删除非 ascii 字符并在非 ascii 字符使用 Perl 单行符的字段中附加一个空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22697017/

相关文章:

html - 如何在 Web 表单字段/输入标签上禁用浏览器自动完成功能?

java - 从 jaxb 生成的 xml 中删除独立的 ="yes"

html - 如何水平居中元素?

javascript - 我应该为 JavaScript 链接使用哪个 "href"值, "#"还是

Excel VBA - 仅在顶部和底部添加边框的总行

html - 为什么 HTML 认为 “chucknorris” 是一种颜色?

javascript - 如何检查是否在 jQuery 中选中了复选框?

css - 使用 CSS 更改 HTML5 输入的占位符颜色

html - 在 CSS 中设置 cellpadding 和 cellspacing?

javascript - 如何使用 JavaScript 更改元素的类?