我有一个文件如下:
line1
line2
line3
我想要得到:
prefixline1
prefixline2
prefixline3
我可以编写Ruby脚本,但如果我不需要这样做会更好。
前缀将包含/。为路径,例如“/opt/workdir/”。
我有一个文件如下:
line1
line2
line3
我想要得到:
prefixline1
prefixline2
prefixline3
我可以编写Ruby脚本,但如果我不需要这样做会更好。
前缀将包含/。为路径,例如“/opt/workdir/”。
当前回答
awk '$0="prefix"$0' file > new_file
在awk中,默认操作是'{print $0}'(即打印整行),因此上面的操作相当于:
awk '{print "prefix"$0}' file > new_file
使用Perl(就地替换):
perl -pi 's/^/prefix/' file
其他回答
虽然我不认为pierre有这种顾虑,但我需要一种解决方案,它不会延迟来自文件的实时“尾部”的输出,因为我想同时监视几个警报日志,并在每行之前加上各自日志的名称。
不幸的是,sed、cut等引入了太多的缓冲,使我无法看到最新的行。Steven Penny建议使用nl的-s选项很有趣,测试证明它没有引入我担心的不必要的缓冲。
不过,使用nl有几个问题,与去掉不需要的行号有关(即使您不关心它的美观性,也可能在某些情况下不希望使用额外的列)。首先,使用“cut”去除数字再次引入了缓冲问题,因此它破坏了解决方案。其次,使用“-w1”也没有帮助,因为这并没有将行号限制为单个列——它只会随着需要的数字的增加而变得更宽。
如果您想在其他地方捕获它,这并不漂亮,但由于这正是我不需要做的事情(所有内容都已写入日志文件,我只想实时地同时查看几个),因此丢失行号并只保留我的前缀的最佳方法是用一个马车返回符(CR或^M或Ctrl-M)开始-s字符串。例如:
#!/bin/ksh
# Monitor the widget, framas, and dweezil
# log files until the operator hits <enter>
# to end monitoring.
PGRP=$$
for LOGFILE in widget framas dweezil
do
(
tail -f $LOGFILE 2>&1 |
nl -s"^M${LOGFILE}> "
) &
sleep 1
done
read KILLEM
kill -- -${PGRP}
下面是一个使用moreutils的ts命令的高可读性的联机解决方案
$ cat file | ts prefix | tr -d ' '
以及它是如何一步步推导出来的:
# Step 0. create the file
$ cat file
line1
line2
line3
# Step 1. add prefix to the beginning of each line
$ cat file | ts prefix
prefix line1
prefix line2
prefix line3
# Step 2. remove spaces in the middle
$ cat file | ts prefix | tr -d ' '
prefixline1
prefixline2
prefixline3
如果你的前缀有点复杂,就把它放在一个变量中:
prefix=path/to/file/
然后,你传递这个变量,让awk来处理它:
awk -v prefix="$prefix" '{print prefix $0}' input_file.txt
SETLOCAL ENABLEDELAYEDEXPANSION
YourPrefix=blabla
YourPath=C:\path
for /f "tokens=*" %%a in (!YourPath!\longfile.csv) do (echo !YourPrefix!%%a) >> !YourPath!\Archive\output.csv
如果您需要在每行具有特定字符串的开头预先添加文本,请尝试以下操作。在下面的例子中,我在每一行有“rock”的行开始添加#。
sed -i -e 's/^.*rock.*/#&/' file_name