如何使用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 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
插入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
否则原始命令可能会丢失。