【发布时间】:2011-02-21 14:48:40
【问题描述】:
如何使用 bash 在文件的每一行之后添加一个字符串?可以用sed命令完成吗,如果可以怎么办?
【问题讨论】:
如何使用 bash 在文件的每一行之后添加一个字符串?可以用sed命令完成吗,如果可以怎么办?
【问题讨论】:
如果您的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
【讨论】:
touch临时文件?我会让sed 命令以cp 的成功为条件,否则原始命令可能会丢失。
sed -e 's/^/string after each line/' -i filename $ 表示行尾。 ^ 表示行首。
$ also acts as a special character only at the end of the regular expression。所以$ 正则表达式抓取每行的结尾,s/$/appendix/ 用给定的字符串替换行的结尾。这是我的理解。
我更喜欢使用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
【讨论】:
NR 变量:awk '{print $0, NR}'
sed 's/ //g' 这符合我的要求,但它会删除每一行中的空格,这就是 g 用于一行中任何地方的选项。
, 喜欢 {print $0"string to append after each line"}。
我更喜欢echo。使用纯 bash:
cat file | while read line; do echo ${line}$string; done
【讨论】:
ls 的输出一起使用(或任何产生多行输出的东西)。
如果你有它,lam(层压)实用程序可以做到,例如:
$ lam filename -s "string after each line"
【讨论】:
纯 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
Shell 工具使用paste、yes、head
&wc:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
注意paste 在$suffix 之前插入了一个Tab 字符。
当然sponge 可以替换为临时文件,然后mv'd 覆盖原始文件名,就像其他一些答案一样......
【讨论】:
sed更可取,除非资源非常有限。
sed。
这只是添加使用 echo 命令在文件中每一行的末尾添加一个字符串:
cat input-file | while read line; do echo ${line}$"string to add" >> output-file; done
添加 >> 会将我们所做的更改定向到输出文件。
【讨论】:
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
【讨论】:
cat foo;回声 ${i}bar;完成了 foobar barbar bazbar 但经过一些测试,我的推理可能是错误的,但丹尼斯是对的
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done) 即使输入是 1 行 foo bar 也会打印 2 行(和 cat 从标准输入读取而不是文件对此没有任何影响)。