使用Shell脚本为每行添加后缀

21
我需要在文本文件的每一行末尾添加一些单词。如何使用Bash脚本实现?
例如:在每一行末尾添加单词done
line1 abcdefg done
line2 abcdefg done
line3 abcdeft done
5个回答

37

使用awk:

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

使用带有内联标志的OR sed:

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

2
解决方案的问题在于它们会在文件末尾添加一行额外的 done - 这不是我们想要的。 - Andrew Savinykh

3

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

我有读过吗?

script.vim的内容:

set backup
g/^/ normal A done
normal ZZ

运行它的方式如下:

vim -S script.vim infile

它会直接修改文件并创建一个备份,备份文件名以~作为后缀。

1
如果您想要使用纯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的评论进行了编辑。

人们可能认为循环中对 $TMPFILE 的多次追加可以在循环结束时用单个 >$TMPFILE 替换。 - iruvar
@1_CR 的确,这样会更好,我已经更改了代码以反映这一点。 - imp25
顺便提一下,将 IFS 设置为空字符串并传递 -rread,就像这样 while IFS= read -r x;.. 在这里了解更多。另外加一分。 - iruvar

0
Perl 的方式……与 awk 单行代码相同
line1 abcdefg 
line2 abcdefg 
line3 abcdeft 

代码

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

更好的写法是 "@F"(注意双引号),而不是 $F[0]," ",$F[1]。以防万一,行的长度可能会超过(或少于)两个单词。 - Birei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接