我有一个文件如下:

line1
line2
line3

我想要得到:

prefixline1
prefixline2
prefixline3

我可以编写Ruby脚本,但如果我不需要这样做会更好。

前缀将包含/。为路径,例如“/opt/workdir/”。


当前回答

艾德:使用

ed infile <<'EOE'
,s/^/prefix/
wq
EOE

对于每一行(,),它用前缀替换行(^)的开头。Wq保存并退出。

如果替换字符串包含斜杠,我们可以使用不同的分隔符代替s:

ed infile <<'EOE'
,s#^#/opt/workdir/#
wq
EOE

我引用了here-doc分隔符EOE(“end of ed”),以防止参数扩展。在这个例子中,不加引号也可以工作,但是如果ed脚本中出现$,这是一个很好的实践,可以防止出现意外。

其他回答

awk '$0="prefix"$0' file > new_file

在awk中,默认操作是'{print $0}'(即打印整行),因此上面的操作相当于:

awk '{print "prefix"$0}' file > new_file

使用Perl(就地替换):

perl -pi 's/^/prefix/' file

你可以在Ex模式下使用Vim:

ex -sc '%s/^/prefix/|x' file

%选择所有行 年代取代 保存并关闭

SETLOCAL ENABLEDELAYEDEXPANSION

YourPrefix=blabla

YourPath=C:\path

for /f "tokens=*" %%a in (!YourPath!\longfile.csv)     do (echo !YourPrefix!%%a) >> !YourPath!\Archive\output.csv

如果你的前缀有点复杂,就把它放在一个变量中:

prefix=path/to/file/

然后,你传递这个变量,让awk来处理它:

awk -v prefix="$prefix" '{print prefix $0}' input_file.txt

如果您需要在每行具有特定字符串的开头预先添加文本,请尝试以下操作。在下面的例子中,我在每一行有“rock”的行开始添加#。

sed -i -e 's/^.*rock.*/#&/' file_name