Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用shell脚本为每行添加后缀_Linux_Bash_Shell_Vim - Fatal编程技术网

Linux 使用shell脚本为每行添加后缀

Linux 使用shell脚本为每行添加后缀,linux,bash,shell,vim,Linux,Bash,Shell,Vim,我需要在文本文件的每行末尾添加一些单词。如何使用Bash脚本实现这一点 示例:在每行末尾添加单词done: line1 abcdefg完成 第2行abcdefg已完成 第3行abcdeft完成 使用awk: awk 'NF{print $0 " done"}' inFile 或带内联标志的sed: sed -i.bak '!/[^[:blank:]]/s/$/ done/' inFile 我读了吗 script.vim的内容: set backup g/^/ normal A done no

我需要在文本文件的每行末尾添加一些单词。如何使用Bash脚本实现这一点

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

line1 abcdefg完成
第2行abcdefg已完成
第3行abcdeft完成
使用awk:

awk 'NF{print $0 " done"}' inFile
或带内联标志的sed:

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

script.vim的内容

set backup
g/^/ normal A done
normal ZZ
像这样运行:

vim -S script.vim infile

它将修改文件,创建后缀为
~
的备份。

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

#!/bin/bash

INFILE=$1
TMPFILE=/tmp/$INFILE.$$


while IFS= read -r; do
    echo "$REPLY done"; 
done <$INFILE >$TMPFILE ;

mv $TMPFILE $INFILE;

根据1CR的评论进行编辑。

。。。与awk一号班轮相同

输入

line1 abcdefg 
line2 abcdefg 
line3 abcdeft 
代码

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

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

人们可能会认为循环中
$TMPFILE
的多个附件可以在循环结束时替换为单个
$TMPFILE
loop@1_CR事实上,这样做会更好,我已经更改了代码以反映这一点。在执行此操作时,请将
IFS
设置为空字符串,并将
-r
传递给
read
,类似于
,而IFS=read-rx。。阅读所有关于它的信息+1,BTWBetter
“@F”
(注意双引号)表示
$F[0],“”,$F[1]
。以防行长度(或短于)超过两个单词。解决方案的问题在于,他们在文件末尾添加了一行
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