如何使用bash在文件的每一行之后添加字符串?可以使用sed命令完成此操作吗?
如何使用bash在文件的每一行之后添加字符串?可以使用sed命令完成此操作吗?
Answers:
如果您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 -e 's/^/string after each line/' -i filename $表示行尾。^表示行首。
sed 's/^/string after each line/'则执行我期望的操作(在每行之前),但sed 's/^/string after each line/'不会(将整个行替换为我的附加字符串)。是什么赋予了?有什么想法@TomDeGisi吗?
我更喜欢使用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"}。
纯POSIX外壳和sponge:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge filexargs和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插入Tab字符$suffix。
当然sponge可以用一个临时文件代替,之后mv用原始文件名代替其他一些答案...
sed除非资源非常有限,否则这些都不是最可取的。
sed如此简单的工作是不需要的。
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,但是经过一些测试,我的推理可能错了,但Dennis是对的
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)即使输入为1行也打印2行foo bar(并且cat从stdin而不是文件中读取内容对此没有任何影响)。
touch是临时文件?并且我将以该sed命令的成功为条件,cp否则原始命令可能会丢失。