在unix shell脚本中用空格替换换行符

时间:2011-02-18 08:26:16

标签: shell unix replace space linefeed

我有一个包含一些记录的文本文件。每个记录分为4行(并不总是4行),如示例所示:

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

每行以换行符(LF)结束。 好的,我只需要在一行中获取记录,用空格替换LF字符,如例:

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

对解决方案有何帮助或建议? 提前谢谢。

6 个答案:

答案 0 :(得分:7)

也许这可行吗?

cat FILE | xargs | sed "s/ ---- /\n---- /g"

答案 1 :(得分:5)

tr  "\n" " "  <file | awk '{gsub(/--+/,"\n&");print}'

或全部在一个awk

awk '/--/{print s;printf $0;s=""}!/--/{s=s" "$0}END{print s}' file

答案 2 :(得分:1)

这是一个更简单的方法

cat text_file | tr '\n' ' ' | sed 's/ ---/\n---/g'

答案 3 :(得分:0)

您需要知道记录之间的分隔符究竟是什么。在你的例子中,它看起来像'----',但你也说过有不同数量的记录。

无论如何,像这样的事情最好用这样的代码完成:

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"; }
)

答案 4 :(得分:0)

使用awk而不是shell脚本

通过文本文件进行迭代并根据行内容执行不同的操作,正是awk的设计目标。

在21世纪,shell脚本应该保持简单,其他工具用于复杂的逻辑。

答案 5 :(得分:0)

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