Замените перевод строки пробелом в сценарии оболочки Unix - PullRequest
1 голос
/ 18 февраля 2011

У меня есть текстовый файл, содержащий несколько записей.Каждая запись разбита на 4 строки (не всегда 4), как в примере:

----
row1
row2
row3
row4
----
row1
etc...

Каждая строка заканчивается символом перевода строки (LF).Хорошо, мне нужно получить запись только в одной строке, заменив символ LF пробелом, как в примере:

---- row1 row2 row3 row4
---- row1 row2 ...etcetera

Любая помощь или предложение для решения?Заранее спасибо.

Ответы [ 6 ]

7 голосов
/ 18 февраля 2011

может это может сработать?

cat FILE | xargs | sed "s/ ---- /\n---- /g"
5 голосов
/ 18 февраля 2011
tr  "\n" " "  <file | awk '{gsub(/--+/,"\n&");print}'

или все в одном awk

awk '/--/{print s;printf $0;s=""}!/--/{s=s" "$0}END{print s}' file
1 голос
/ 18 февраля 2011

А гораздо более простой подход будет такой

cat text_file | tr '\n' ' ' | sed 's/ ---/\n---/g'
0 голосов
/ 18 февраля 2011

awk 'BEGIN {RS="----"; FS="\n"; OFS=" "} FNR==1 {next} {$1=RS $1; print}' input.file

0 голосов
/ 18 февраля 2011

Используйте для этого awk, а не сценарий оболочки

Итерация по текстовому файлу и выполнение разных действий на основе содержимого строки - это именно то, для чего был разработан awk.

В 21-м веке скрипты оболочки должны быть простыми, а другие инструменты используются для сложной логики.

0 голосов
/ 18 февраля 2011

Вам необходимо знать, что именно является разделителем между записями. В вашем примере это выглядит как «----», но вы также сказали, что существует переменное количество записей.

В любом случае, подобные вещи лучше всего делать с помощью кода, подобного следующему:

cat source | (
  acc=""
  while read -r line; do
  if test "$line" = "----" -a -n "$acc"; then
    echo "$acc"
    acc="$line"
  else
    test -n "$acc" && { acc="$acc "; }
    acc="${acc}$line"
  fi
  done
  test -n "$acc" && { echo "$acc"; }
)
...