Answers:
您可以使用sed
:
sed -i 's/^/your_string /' your_file
感谢Stephane和Marco的评论,请注意,该-i
选项不是POSIX。POSIX的方法可以做到
sed 's/^/your_string /' your_file > tmp_copy && mv tmp_copy your_file
或perl
:
perl -pi -e 's/^/your_string /' your_file
说明
这两个命令都执行正则表达式替换,用^
所需的字符串替换行()的开头。这-i
两个命令中的开关可确保在适当位置编辑文件(即,更改将反映在文件中,而不是打印到stdout)。
sed
应该可以在任何符合POSIX的操作系统上使用,并且perl
应该在大多数现代Unices上都可以使用,除了那些经过努力将其删除的软件。
sed -i
不是POSIX。是GNU。FreeBSD sed
也有类似的选项,但是您需要sed -i ''
那里。
-i
创建一个临时副本(这就是为什么我说所做的更改会反映在原始文件中的原因);我的意思是,您获得与就地替换相同的语义。请检查更新后的答案是否符合POSIX。
$$
(当前shell的进程ID)作为临时文件名的一部分。这样就避免了每次都在考虑保证唯一名称的command filename > filename.$$ && mv filename.$$ filename
:|paste -d'foo ' - - - - input > output
(开个玩笑,尽管您可能会发现它是此处发布的所有解决方案中最快的:-b)。
规范的方式是:
sed 's/^/foo /' < input > output
但是,它不容易适应任意字符串。例如,
sed "s/^/$var /"
只有工作,如果$var
不包含,&
,\
,/
也不是换行符。
在这方面,
export var
awk '{print ENVIRON["var"], $0}'
要么
perl -pe '$_="$ENV{var} $_"'
会更好。
我使用awk
前缀字符串“ foo” 提出了一种解决方案。
awk '{ print "foo", $0; }' input > output
awk
是跨平台的,可在任何POSIX系统上使用。它不执行就地编辑。如果要编辑文件而不创建第二个文件,则必须使用一个临时文件。请参阅约瑟夫的sed
答案,它显示了语法。另一个技巧是使用以下语法,该语法基本上是使用与原始文件相同的文件名创建一个临时文件。
{ rm file; awk '{ print "foo", $0 }' > file; } < file
reducto# wc -l foo
`914 foo` reducto# { rm foo ; awk '{ print "prepend" , $0 }' > foo } < foo
>
这似乎不起作用。我正在尝试,因为重定向到原始版本使我感到紧张,但它甚至没有开始。
您可以使用perl
以下方法:
$ perl -pi -e 's/^/mystring /' afile.txt
创建一个示例文件。
$ seq 5 > afile.txt
$ cat afile.txt
1
2
3
4
5
运行上面的命令:
$ perl -pi -e 's/^/mystring /' afile.txt
$ cat afile.txt
mystring 1
mystring 2
mystring 3
mystring 4
mystring 5
sed
,我显示了如何使用Perl ....
只需使用Bash
while IFS= read -r line; do echo "foo" "${line}" ; done < input > Output
使用Python
python -c "import sys; print 'foo '.join([ l for l in sys.stdin.readlines() ])" < input > Output
如果要就地编辑
import fileinput
import sys
for line in fileinput.input(['inputfile'], inplace=True):
sys.stdout.write('foo {l}'.format(l=line))
awk
很小的文件要快。行为在回显实现中会有所不同,并且会去除前导和尾随空格,并专门处理反斜杠。
prefix () { while IFS= read -r REPLY; do printf "%s%s\n" "$1" "$REPLY"; done; }
应该更正确。
{}
呢?我认为@Matt建议您将其制成命名函数,{}
没有函数名又有什么意义呢?
或者,您可以执行以下操作:
vi filename.txt
Esc(以确保您处于NORMAL
模式下),然后输入以下命令:
:1,$ s/^/mystring
1,$
为simple %
。这使命令:%s/^/string/
。
-i
开关未在适当位置编辑文件。它创建一个新文件,并在完成后覆盖原始文件(证明:inode发生了变化)。实际上没有很多工具可以进行就地编辑,这是很危险的操作。此外,由于您提到了POSIX,因此-i
对于POSIX兼容而言,此开关不是必需的sed
,这是某些特定实现的功能。