在 Bash 中,如何在文件中的每一行后面添加字符串?

如何使用 bash 在文件中的每一行后面添加字符串?可以使用 sed 命令来完成吗? 如果可以的话,如何完成?

203542 次浏览

如果您的 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

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

如果你有它,我是(层压)实用程序可以做到这一点,例如:

$ lam filename -s "string after each line"

我更喜欢使用 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
  1. POSIX 外壳sponge:

    suffix=foobar
    while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
    sponge file
    
  2. xargs and printf:

    suffix=foobar
    xargs -L 1 printf "%s${suffix}\n" < file | sponge file
    
  3. Using join:

    suffix=foobar
    join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
    
  4. Shell tools using paste, yes, head & wc:

    suffix=foobar
    paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
    

    请注意,paste$suffix之前插入一个 标签字符。

当然,可以用一个临时文件替换 sponge,然后用原始文件名替换 mv,就像其他一些答案一样..。

我更喜欢使用纯 bash:

cat file | while read line; do echo ${line}$string; done

这只是添加了使用 echo 命令在文件中的每一行末尾添加一个字符串:

cat input-file | while read line; do echo ${line}"string to add" >> output-file; done

添加 >将指导我们对输出文件所做的更改。