【问题标题】:Linux Script: substituting a multiple lines with single line of textLinux脚本:用单行文本替换多行
【发布时间】:2014-01-29 04:02:02
【问题描述】:

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

我有一个类似的文件:

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

我想得到一个文件:

abc
def
ghi

【问题讨论】:

  • 类似 'i=0;而读线;做测试 $((++i))',但我没有找到任何解决方案
  • 我刚看到你的回答stackoverflow.com/a/21042715/1983854。你为什么不给出正确的输入?所有方法都基于您的输入,这与您在答案中使用的方法相去甚远。
  • @fedorqui 而且,他/她的回答是最长的,也是最难理解的:)

标签: linux bash shell


【解决方案1】:

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】:

    可以使用awk

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

    一个 bash 方法是

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

    【讨论】:

      【解决方案3】:

      awk 以外的解决方案:

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

      【讨论】:

        【解决方案4】:

        一个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 &lt; file 以 4 列的块打印文件。 cut -d' ' -f1-3 从第 1 列打印到第 3 列。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 你可以说tr -d '\n' &lt; file | tr '*' '\n',而不是使用 2 个管道
          【解决方案6】:

          你可以在没有 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
          

          【讨论】:

            【解决方案7】:

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

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

            在这种情况下,正确意味着最轻量级、最不笨拙、最不容易出错以及对目标的认知要求最低。其他解决方案有效,但 tr 的隐藏成本最低。当您像在 unix 中那样使用大量小工具时,这些小优势确实会随着时间的推移而累积。

            【讨论】:

              【解决方案8】:

              感谢大家,我找到了这个解决方案,以防文件像这样

              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
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-02-27
                • 2010-09-18
                • 2018-07-18
                • 2022-10-06
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多