我有一个文件,我想反转其中的所有单词。
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
(空格、逗号、点或任何其他定义的字符)和单个其他字符直接放入行中,首先收集连续数量的其他字符,然后反转它们,然后再将它们添加到行中。