反转当前行的所有单词

反转当前行的所有单词

我有一个文件,我想反转其中的所有单词。

ex 输入文件:

DCBA. HGFE.GI
MLK,PON.RQ
UTS. ZYXWV. 321

ex 输出文件:(我想要的是

ABCD. EFGH.IG
KLM,NOP.QR
STU. VWXYZ. 123

使用这个 sed 脚本: sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'整行都被反转。

上述命令产生的错误输出:

IG.EFGH .ABCD    
QR.NOP,KLM    
123 .VWXYZ .STU 

我怎样才能得到我想要的输出?

答案1

在纯 Bash 中尝试这个

#!/bin/bash
while IFS= read -N1 char; do
    if [[ "$char" =~ [[:alnum:]] ]]; then
        word="$char$word"
    else
        echo -n "$word$char"
        word=""
    fi
done <input.file >output.file

输出 :

ABCD. EFGH.IG
KLM,NOP.QR
STU. VWXYZ. 123

这个代码逻辑非常简单。我们逐个字符地读取文件(-N1这要归功于标志。IFS=也需要能够读取换行符),然后我们将遇到的每个有效字符添加到变量的开头$word(从而反转单词)。当我们遇到非字母数字字符时,我们会回显 的值$word并将该值重置为空。我们重复这些步骤,直到文件末尾

答案2

所以,你真的想逆转每一个单词,不是每个句子,对吧?或者你的逗号应该是句号?

perl -pe 's/(\w+)/ reverse $1 /eg' << END
DCBA. HGFE.GI
MLK,PON.RQ
UTS. ZYXWV. 321
END
ABCD. EFGH.IG
KLM,NOP.QR
STU. VWXYZ. 123

如果您想要重定向,请执行以下操作:

perl -pe 's/(\w+)($|\W+)/ reverse($1) . $2 /eg' < file_in > file_out

按照我的例子,

perl -pe 's/(\w+)($|\W+)/ reverse($1) . $2 /eg' << END > file_out

不要将重定向放在与 heredoc 的终止词相同的行上。如果这样做,shell 将无法找到 heredoc 的结尾。

在重定向到文件和从文件重定向时,切勿这样做:command < file > file使用同一个文件。重定向会发生命令启动后,>会将文件截断为零长度。命令启动时,输入文件已被销毁。

答案3

详细(python)选项:

#!/usr/bin/env python3

with open("/path/to/sourcefile") as messed_up:
    lines = [list(line.replace("\n", "")) for line in messed_up]

def reverse_line(l):
    i=0; line = ""; sep = (" ", ",",".")
    while i < len(l):
        word = []
        while not l[i] in sep:
            word.append(l[i]); i = i+1
            if i == len(l):
                line = line + ("").join(reversed(word)); break
        else:
            line = line + ("").join(reversed(word)) + l[i]
        i = i+1
    print(line)

for l in lines:
    reverse_line(l)

输出:

ABCD. EFGH.IG
KLM,NOP.QR
STU. VWXYZ. 123

行是从左到右“构建”的;列表中的字符sep(空格、逗号、点或任何其他定义的字符)和单个其他字符直接放入行中,首先收集连续数量的其他字符,然后反转它们,然后再将它们添加到行中。

相关内容