Linux脚本:用单行文本替换多行

时间:2014-01-10 09:02:16

标签: linux bash shell

我应该在Linux中使用哪个shell脚本来用一行替换n行文本的组?

我有一个类似的文件:

a
b
c
*
d
e
f
*
g
h
i
*

我希望得到一个文件:

abc
def
ghi

8 个答案:

答案 0 :(得分:2)

可以使用awk

awk '{if ($0=="*"){print s;s=""}else{s=s$0}}' file

bash方式是

while read x
do
   [ "$x" == "*" ] && echo  || echo -n $x
done < file

答案 1 :(得分:2)

sed方式:

sed ':a;N;$!ba;s/\n//g' < t | sed 's:*:\n:g'

t是您要更改的文件。

的引用: How can I replace a newline (\n) using sed? Why does sed not replace all occurrences?

第一个命令没有替换\ n。第二个用\ n替换*。

顺便说一句,sed是一个非常强大的流编辑器工具,知道它可以以比你想象的更多的方式帮助你。

答案 2 :(得分:1)

除了awk解决方案:

tr '\n' ' ' < Input.txt |sed 's/ //g' | tr '*' '\n'

答案 3 :(得分:0)

一种awk方式:

$ awk '/\*/ {printf "\n"; next} {printf $1}' file
abc
def
ghi
  • 如果是*,请打印一个新行。否则,打印角色。使用printf,除非指定,否则不添加新行。

使用xargs

$ xargs -n4 < file | cut -d' ' -f1-3
a b c
d e f
g h i
  • xargs -n4 < file以4列为单位打印文件。 cut -d' ' -f1-3从第1列打印到第3列。

答案 4 :(得分:0)

如果您将*视为行代码,请尝试删除'\ n'并替换STAR。

cat <youfile> | tr -d '\n' | tr '*' '\n'

答案 5 :(得分:0)

你可以在没有awk,tr或外部任何东西的shell中做到这一点:

#!/bin/bash
while read x
do
   if [ "$x" == "*" ]; then
      echo $line
      line=""
   else
      line="$line$x"
   fi
done

另存为“go”,然后执行:

chmod +x go
./go <inputfile

答案 6 :(得分:0)

我相信tr可以被认为是替换单个字符的正确工具。

tr -d '\n' < file | tr '*' '\n'

在这种情况下纠正将意味着最轻量级,最不笨拙,最不容易出错,并且对此目的的认知要求最低。其他解决方案有效,但tr的隐藏成本最低。当你在unix中使用很多小工具时,这些小优点确实会随着时间的推移而增加。

答案 7 :(得分:0)

感谢大家,我发现这个解决方案适用于文件

的情况
field1     2008
field2     703
field3     qeew
field4     80
field5     52
field6     749.11

field1     2009
field2     532
field3     wecwer
field4     82
field5     44
field6     649.97

...

#!/bin/bash

if [ "$1" = "" ]
then
   echo "missing file name"
   exit 1
fi

N=7
i=0
FULL_ROW=""
SAVEIFS=$IFS
if [ -f $1 -a -r $1 ]; then
    LAST_DATA_SCAD=""
    while IFS=$(echo -en "|\n\b") read -ra ROW_RECORD; do

    if [[ "$FULL_ROW" == "" ]]
       then
        FULL_ROW=${ROW_RECORD:11}
       else
        FULL_ROW=$FULL_ROW"|"${ROW_RECORD:11}
    fi
    i=$((i+1))
    if [ $((10#$i)) == $N ]
    then
      echo $FULL_ROW
      FULL_ROW=""
      i=0
    fi
    done < "$1"
   else
     echo "file not found"
   fi
   IFS=$SAVEIFS