在每行的开头添加前缀字符串

时间:2010-01-20 06:36:31

标签: linux scripting text-processing

我有一个文件如下:

line1
line2
line3

我想得到:

prefixline1
prefixline2
prefixline3

我可以写一个Ruby脚本,但如果我不需要它会更好。

prefix将包含/。这是一条路径,例如/opt/workdir/

17 个答案:

答案 0 :(得分:450)

# 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

如果prefix包含/,您可以使用prefix以外的任何其他字符,或者 转义/,以便sed命令变为

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

答案 1 :(得分:111)

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

使用Perl(就地替换):

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

答案 2 :(得分:29)

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

ex -sc '%s/^/prefix/|x' file
  1. %选择所有行

  2. s替换

  3. x保存并关闭

答案 3 :(得分:19)

如果您的前缀有点复杂,只需将其放在变量中:

prefix=path/to/file/

然后,你传递那个变量并让awk处理它:

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

答案 4 :(得分:9)

如果你有Perl:

perl -pe 's/^/PREFIX/' input.file

答案 5 :(得分:5)

使用shell:

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

答案 6 :(得分:4)

使用&(与模式匹配的输入的整个部分”):

cat in.txt | sed -e "s/.*/prefix&/" > out.txt

使用反向引用进行操作:

cat in.txt | sed -e "s/\(.*\)/prefix\1/" > out.txt

答案 7 :(得分:2)

虽然我不认为pierr有这个问题,但我需要一个不会延迟文件实时“尾部”输出的解决方案,因为我想同时监控多个警报日志,在每行前面加上名称各自的日志。

不幸的是,sed,cut等引入了太多缓冲,让我无法看到最新的线条。 Steven Penny建议使用-s的{​​{1}}选项是有趣的,并且测试证明它没有引入与我有关的不需要的缓冲。

使用nl时遇到了一些问题,与剥离不需要的行号的愿望有关(即使你不关心它的美学,也许有些情况下使用额外的列将是不合需要的)。首先,使用“剪切”去除数字会重新引入缓冲问题,因此它会破坏解决方案。其次,使用“-w1”没有帮助,因为这不会将行号限制为单个列 - 它只会随着需要更多数字而变宽。

如果你想在其他地方捕获它,这并不漂亮,但是因为这正是我不需要做的事情(所有内容都已写入日志文件,我只是想实时观看几个) ,丢失行号并且只有我的前缀的最好方法是用回车符(CR或^ M或Ctrl-M)启动nl字符串。例如:

-s

答案 8 :(得分:2)

  1. 您还可以使用反向引用技术实现此目的

    sed -i.bak 's/\(.*\)/prefix\1/' foo.txt
    
  2. 您也可以像这样使用awk

    awk '{print "prefix"$0}' foo.txt > tmp && mv tmp foo.txt
    

答案 9 :(得分:1)

使用ed:

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

对于每行(,),用^替换行(prefix)的开头。 wq保存并退出。

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

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

我引用了here-doc分隔符EOE(“ ed的结尾”)以防止参数扩展。在此示例中,它也可以不加引号,但是如果您的ed脚本中有$,这是防止意外的好习惯。

答案 10 :(得分:1)

使用 Pythonize (pz):

pz '"preix"+s' <filename

答案 11 :(得分:1)

这是使用moreutils的ts命令的高度易懂的oneliner解决方案

$ 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

答案 12 :(得分:0)

有一个名为lam的标准unix实用程序,是层压板的缩写。 lam -s prefix file将做您想要的。我在管道中使用它,例如:

find -type f -exec lam -s "{}: " "{}" \; | fzf

...将查找所有文件,对每个文件执行lam,为每个文件添加其自己文件名的前缀。 (然后将输出泵送到fzf进行搜索。)

答案 13 :(得分:0)

SETLOCAL ENABLEDELAYEDEXPANSION

YourPrefix=blabla

YourPath=C:\path

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

答案 14 :(得分:0)

如果您需要在每行的开头添加具有特定字符串的文本,请尝试以下操作。在下面的示例中,我在每行的开头添加#,其中包含单词“ rock”。

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

答案 15 :(得分:0)

以下是使用this answer中的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

答案 16 :(得分:0)

使用 bash 在命令行上使用 for 循环的简单解决方案:

for i in $(cat yourfile.txt); do echo "prefix$i"; done

将输出保存到文件:

for i in $(cat yourfile.txt); do echo "prefix$i"; done > yourfilewithprefixes.txt