Инвертируйте все слова в текущей строке

У меня есть файл, и я хочу инвертировать все слово в нем.

исключая входным файлом:

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 

Как я могу получить свой желаемый вывод?

2
задан 23 August 2014 в 17:25

3 ответа

Попробуйте этого в чистом ударе

#!/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 и сбрасываем значение для освобождения. Мы повторяем те шаги до конца файла

7
ответ дан 5 August 2019 в 08:25

Так, Вы действительно хотите инвертировать каждый 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 с тем же файлом. Перенаправления происходят прежде , команда запускается, и > усечет файл для обнуления длины. Когда команда запускается, входной файл был уже уничтожен.

4
ответ дан 5 August 2019 в 08:25

И подробное (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 список (пробелы, запятые, точки или любой другой определенный-) и единственные другие символы помещается непосредственно в строку, последовательное количество других символов собраны сначала и инвертированы, прежде чем они будут добавлены к строке.

1
ответ дан 5 August 2019 в 08:25

Другие вопросы по тегам:

Похожие вопросы: