我有一个文件如下:

line1
line2
line3

我想要得到:

prefixline1
prefixline2
prefixline3

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

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


当前回答

使用shell:

#!/bin/bash
prefix="something"
file="file"
while read -r line
do
 echo "${prefix}$line"
done <$file > newfile
mv newfile $file

其他回答

# If you want to edit the file in-place
sed -i -e 's/^/prefix/' file

# If you want to create a new file
sed -e 's/^/prefix/' file > file.new

如果前缀包含“/”,则可以使用前缀以外的任何字符或 转义/,这样sed命令就变成了

's#^#/opt/workdir#'
# or
's/^/\/opt\/workdir/'

使用shell:

#!/bin/bash
prefix="something"
file="file"
while read -r line
do
 echo "${prefix}$line"
done <$file > newfile
mv newfile $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}

下面是一个使用sed方法的示例:

$ cat /path/to/some/file | prefix_lines "WOW: "

WOW: some text
WOW: another line
WOW: more text

prefix_lines

function show_help()
{
  IT=$(CAT <<EOF
    Usage: PREFIX {FILE}

    e.g.

    cat /path/to/file | prefix_lines "WOW: "

      WOW: some text
      WOW: another line
      WOW: more text
  )
  echo "$IT"
  exit
}

# Require a prefix
if [ -z "$1" ]
then
  show_help
fi

# Check if input is from stdin or a file
FILE=$2
if [ -z "$2" ]
then
  # If no stdin exists
  if [ -t 0 ]; then
    show_help
  fi
  FILE=/dev/stdin
fi

# Now prefix the output
PREFIX=$1
sed -e "s/^/$PREFIX/" $FILE

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

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

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