jim*_*-cl 6 regex formatting perl
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
Run Code Online (Sandbox Code Playgroud)
我想从中删除非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
Run Code Online (Sandbox Code Playgroud)
我也试过使用相同的单行,但这次用空格替换非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
Run Code Online (Sandbox Code Playgroud)
不知何故,非ascii字符似乎占用2个字节而不是一个 - 这是正确的,还是我错过了什么?
预期的输出是这样的:
SPAM EATER PO BOX 5555 FAKE STREET
FOO BAR PO BOX 1234 LOLLERCOASTER VILLAGE
LOL MAN PO BOX 9876 NEXT DOOR
Run Code Online (Sandbox Code Playgroud)
有没有办法,使用Perl单线程,以获得预期的结果?我想到了一种在删除非ascii字符后添加一个空格的方法,在已经进行更改的字段中,但我找不到这样做的方法.此外,非ascii字符可以出现在任何字段上,而不仅仅出现在第二个字段中.
顺便说一句,一些可能有用的信息:这是一AIX台运行的机器Perl v5.8.8.
谢谢!
编辑:
至于@ThisSuitIsBlack没有提及,有两个非ascii字符.因此,我想我只想在该字段的末尾添加一个空格,如果该命令至少删除了一个非ascii字符. 有没有办法让这个额外的空间包含在同一个句子中,所以它也可以作为一个单行程来完成?
编辑:
在查看了大量数据之后,我可以看出非ascii字符始终显示为成对,并且原始文件中的下一个字段(在运行单行之前)与其他列相比总是在右边一个空格.所以,我正在改变这个问题的标题以符合要求: Perl one-liner删除非ascii字符并在非ascii字符所在的字段中追加一个空格
小智 4
去掉2个非ascii,在字段后加1个空格。
\n使用非 ASCII 和 3 个空格作为分隔符对。
# s/[^[:ascii:]]{2}(.*?[ ]{3})/$1 /g\n\n [^[:ascii:]]{2} \n ( .*? [ ]{3} )\nRun Code Online (Sandbox Code Playgroud)\n\nPerl测试用例
\n\n$/ = undef;\n$str = <DATA>;\n$str =~ s/[^[:ascii:]]{2}(.*?[ ]{3})/$1 /g;\nprint $str;\n\n__DATA__\nSPAM EATER PO BOX 5555 FAKE STREET\nFOO BAR \xc3\x83\xc2\xacPO BOX 1234 LOLLERCOASTER VILLAGE\nLOL MAN PO BOX 9876 NEXT DOOR\nRun Code Online (Sandbox Code Playgroud)\n\n输出>>
\n\nSPAM EATER PO BOX 5555 FAKE STREET\nFOO BAR PO BOX 1234 LOLLERCOASTER VILLAGE\nLOL MAN PO BOX 9876 NEXT DOOR\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
5275 次 |
| 最近记录: |