Linux脚本:用单行文本replace多行

我应该在Linux中使用什么shell脚本来用一行代替n行文本?

我有一个像这样的文件:

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

我想要得到一个文件为:

 abc def ghi 

sed方式:

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

t是你想改变的文件。

引用: 如何使用sed替换换行符(\ n)? 为什么sed不能替换所有的事件?

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

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

可以使用awk

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

这是一个bash的方式

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

除了awk解决方案:

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

一个awk方式:

 $ awk '/\*/ {printf "\n"; next} {printf $1}' file abc def ghi 
  • *情况下,打印一个新的行。 否则,打印字符。 使用printf ,以便除非指定,否则不添加新行。

xargs

 $ xargs -n4 < file | cut -d' ' -f1-3 abc def ghi 
  • xargs -n4 < file以4列的块形式打印文件。 从第一列到第三列cut -d' ' -f1-3

如果您将*作为行标记,请尝试删除“\ n”并替换STAR。

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

你可以在没有awk,tr或者外部的情况下在shell中执行它:

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

保存为“去”,然后做:

 chmod +x go ./go <inputfile 

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

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

在这种情况下纠正意味着最轻量,最不笨拙,最不易发生错误,并且对认知要求最低。 其他解决方案的工作,但tr有最小的隐性成本。 当你在unix中使用很多小工具时,这些小优势会随着时间的推移而增加。

感谢大家,我发现这个解决方案,以防万一文件是

 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