У меня есть файл, и я хочу инвертировать все слово в нем.
исключая входным файлом:
DCBA. HGFE.GI
MLK,PON.RQ
UTS. ZYXWV. 321
исключая выходным файлом: (Что я Хочу),
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
Как я могу получить свой желаемый вывод?
Попробуйте этого в чистом ударе
#!/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
и сбрасываем значение для освобождения. Мы повторяем те шаги до конца файла
Так, Вы действительно хотите инвертировать каждый Word , не каждое предложение, правильно? Или Ваша запятая, как предполагается, является периодом?
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. Если Вы сделаете, оболочка не будет в состоянии найти конец heredoc.
С перенаправлением к и из файлов, никогда не делайте это: command < file > file
с тем же файлом. Перенаправления происходят прежде , команда запускается, и >
усечет файл для обнуления длины. Когда команда запускается, входной файл был уже уничтожен.
И подробное (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
список (пробелы, запятые, точки или любой другой определенный-) и единственные другие символы помещается непосредственно в строку, последовательное количество других символов собраны сначала и инвертированы, прежде чем они будут добавлены к строке.