【发布时间】:2013-06-04 04:04:46
【问题描述】:
我需要在文本文件的每一行末尾添加一些单词。如何使用 Bash 脚本执行此操作?
示例:在每行末尾添加单词done:
line1 abcdefg done
line2 abcdefg done
line3 abcdeft done
【问题讨论】:
我需要在文本文件的每一行末尾添加一些单词。如何使用 Bash 脚本执行此操作?
示例:在每行末尾添加单词done:
line1 abcdefg done
line2 abcdefg done
line3 abcdeft done
【问题讨论】:
使用 awk:
awk 'NF{print $0 " done"}' inFile
或 sed 与内联标志:
sed -i.bak '!/[^[:blank:]]/s/$/ done/' inFile
【讨论】:
done 的额外行 - 这不是想要的。
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
【讨论】:
如果您想在纯 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 的多个附加可以在循环结束时用单个>$TMPFILE 替换
IFS 设置为空字符串并将-r 传递给read,类似于while IFS= read -r x;.. 阅读有关它的所有信息here。 +1,顺便说一句
Perl 方式...与 awk one liner 的方式相同
输入
line1 abcdefg
line2 abcdefg
line3 abcdeft
代码
perl -lane 'print $F[0]," ",$F[1]," done"' Input
【讨论】:
$F[0]," ",$F[1] 更好"@F"(注意双引号)。以防万一这行比两个词长(或短)。
我读过vim吗?
script.vim的内容:
set backup
g/^/ normal A done
normal ZZ
像这样运行它:
vim -S script.vim infile
它将就地修改文件,创建带有~ 后缀的备份。
【讨论】: