【问题标题】:Add suffix to each line with shell script使用 shell 脚本为每一行添加后缀
【发布时间】:2013-06-04 04:04:46
【问题描述】:

我需要在文本文件的每一行末尾添加一些单词。如何使用 Bash 脚本执行此操作?

示例:在每行末尾添加单词done

line1 abcdefg done
line2 abcdefg done
line3 abcdeft done

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    使用 awk:

    awk 'NF{print $0 " done"}' inFile
    

    或 sed 与内联标志:

    sed -i.bak '!/[^[:blank:]]/s/$/ done/' inFile
    

    【讨论】:

    • 解决方案的问题是他们在文件末尾添加了一个带有done 的额外行 - 这不是想要的。
    【解决方案2】:

    sed 对这类任务总是有帮助的,

     # cat append.txt
     line1 abcdefg
     line2 abcdefg
     line3 abcdeft
    
     # sed -i 's/$/done/g' append.txt
    
     # cat append.txt
     line1 abcdefg done
     line2 abcdefg done
     line3 abcdeft done
    

    您可以使用以下脚本:

     # cat sedcheck.sh
     #!/bin/bash
     if [ $# -eq 0 ]
        then
          echo "No input supplied"
        else
          sed -i 's/$/ '$1'/g' $2
     fi
    
    
     # cat append.txt
     line1 abcdefg donedin
     line2 abcdefg donedin
     line3 abcdeft donedin
    
     # ./sedcheck.sh testing append.txt
    
     # cat append.txt
     line1 abcdefg donedin testing
     line2 abcdefg donedin testing
     line3 abcdeft donedin testing
    

    【讨论】:

      【解决方案3】:

      如果您想在纯 bash 中执行此操作,您可以这样做:

      #!/bin/bash
      
      INFILE=$1
      TMPFILE=/tmp/$INFILE.$$
      
      
      while IFS= read -r; do
          echo "$REPLY done"; 
      done <$INFILE >$TMPFILE ;
      
      mv $TMPFILE $INFILE;
      

      如果调用append.sh,可以这样调用:

      bash append.sh file.txt
      

      已根据 1_CR 的 cmets 编辑

      【讨论】:

      • 人们会认为循环内对$TMPFILE 的多个附加可以在循环结束时用单个&gt;$TMPFILE 替换
      • @1_CR 确实会更好,我已经更改了代码以反映这一点。
      • 当您使用它时,将IFS 设置为空字符串并将-r 传递给read,类似于while IFS= read -r x;.. 阅读有关它的所有信息here。 +1,顺便说一句
      【解决方案4】:

      Perl 方式...与 awk one liner 的方式相同

      输入

      line1 abcdefg 
      line2 abcdefg 
      line3 abcdeft 
      

      代码

        perl -lane 'print $F[0]," ",$F[1]," done"' Input 
      

      【讨论】:

      • $F[0]," ",$F[1] 更好"@F"(注意双引号)。以防万一这行比两个词长(或短)。
      【解决方案5】:

      我读过吗?

      script.vim的内容:

      set backup
      g/^/ normal A done
      normal ZZ
      

      像这样运行它:

      vim -S script.vim infile
      

      它将就地修改文件,创建带有~ 后缀的备份。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多