6

Следующая команда:

head -n 1 $FILE | tail -n 1

Извлекает текст из первой строки $FILE . Формат каждой строки в $FILE выглядит следующим образом:

1 2 3 4  2 3  3 4 5  4 5 6 7 8 9

Как видите, каждый символ разделен одним пробелом. Каждая группа разделена двумя пробелами. Используя sed мне нужно удалить одиночные пробелы и преобразовать двойные пробелы в одиночные пробелы.

Текст в $FILE создается циклом for, вложенным в другой цикл for. Таким образом, текстовые данные в каждой строке перенаправляются >> в $FILE из основного цикла for после того, как вложенный цикл запустит свой курс. Каждый символ / число в текстовой строке является результатом однократного выполнения вложенного цикла for. Затем основной цикл for отправляет вложенный вывод цикла в $FILE .

Итак, пример псевдокода:

for i in $(seq 1 $RANDOM)
do
    for n in {1..10}
    do
        $do_something
    done

$do_something_else
done >> $FILE

head -n 1 $FILE | tail -n 1 | (sed command here)

То, как код выше структурирован, не имеет значения здесь. Я просто ищу легкий способ для манипулирования текстом, описанным выше относительно пробелов. Если это было задано ранее, мои извинения. Я не мог найти это в моих запросах.

3 ответа3

6

Это должно работать:

sed 's/ \([^ ]\)/\1/g'

Вы также можете заменить всю последнюю строку скрипта следующим образом:

sed -n '1s/ \([^ ]\)/\1/gp' "$FILE"
3

Как насчет этого:

$ head -n1 $FILE | tail -n 1 | sed 's,  ,|,g' | sed 's, ,,g' | sed 's,|, ,g'
1234 23 345 456789

Сначала мы заменим все вхождения двойного пробела на | чтобы отличить их от единичных пробелов, мы удаляем все единичные пробелы и, наконец, заменяем | с одним пробелом.

2

Вы можете сделать замены в одной команде s в sed:

s/ \( \?\)/\1/g

Чтобы выйти после первой строки, мы можем q в строке 1. Собираем это вместе:

sed -e 's/ \( \?\)/\1/g' -e '1q'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .