如何使用bash在文件中的每一行之后添加字符串?是否可以使用sed命令完成,如果是这样的话?
答案 0 :(得分:155)
如果sed
允许通过-i
参数进行编辑:
sed -e 's/$/string after each line/' -i filename
如果没有,你必须制作一个临时文件:
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename
答案 1 :(得分:10)
我更喜欢使用awk
。
如果只有一列,请使用$0
,否则将其替换为最后一列。
单程,
awk '{print $0, "string to append after each line"}' file > new_file
或者,
awk '$0=$0"string to append after each line"' file > new_file
答案 2 :(得分:7)
如果有,lam(层压)实用程序可以执行此操作,例如:
$ lam filename -s "string after each line"
答案 3 :(得分:4)
我更喜欢echo
。使用纯bash:
cat file | while read line; do echo ${line}$string; done
答案 4 :(得分:3)
纯 POSIX shell 和sponge
:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge file
xargs
和printf
:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
使用join
:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
使用paste
,yes
,head
的Shell工具
&wc
:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
请注意,paste
在$suffix
之前插入 Tab 字符。
当然sponge
可以替换为临时文件,然后mv
覆盖原始文件名,还有其他答案...
答案 5 :(得分:-8)
Sed有点难看,你可以像这样优雅地做到:
hendry@i7 tmp$ cat foo
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar