416

我有一个文件如下:

line1
line2
line3

我想得到:

prefixline1
prefixline2
prefixline3

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

prefix将包含/. 例如,它是一条路径/opt/workdir/

4

18 回答 18

639
# 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

如果prefixcontains /,您可以使用任何其他不在的字符prefix,或者转义/,因此sed命令变为

's#^#/opt/workdir#'
# or
's/^/\/opt\/workdir/'
于 2010-01-20T06:38:38.983 回答
140
awk '$0="prefix"$0' file > new_file

在 awk 中默认的动作是'{print $0}'(即打印整行),所以上面的等价于:

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

使用 Perl(就地替换):

perl -pi 's/^/prefix/' file
于 2010-01-20T06:41:22.250 回答
34

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

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

  2. s代替

  3. x保存并关闭

于 2012-09-30T16:18:00.460 回答
26

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

prefix=path/to/file/

然后,您传递该变量并让 awk 处理它:

awk -v prefix="$prefix" '{print prefix $0}' input_file.txt
于 2015-02-17T21:35:11.447 回答
13

如果你有 Perl:

perl -pe 's/^/PREFIX/' input.file
于 2013-12-11T20:08:27.530 回答
9

ts这是使用来自 moreutils 的命令的高度可读的 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
于 2019-04-19T09:41:43.470 回答
8

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

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

或使用反向引用:

cat in.txt | sed -e "s/\(.*\)/prefix\1/" > out.txt
于 2020-04-05T01:15:54.817 回答
6

使用外壳:

#!/bin/bash
prefix="something"
file="file"
while read -r line
do
 echo "${prefix}$line"
done <$file > newfile
mv newfile $file
于 2010-01-20T07:05:30.400 回答
5

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

不幸的是,sed、cut 等引入了太多的缓冲,让我看不到最新的行。Steven Penny 使用-s选项的建议nl很有趣,测试证明它并没有引入我担心的不需要的缓冲。

但是,使用 有几个问题nl,与删除不需要的行号的愿望有关(即使您不关心它的美感,也可能存在不希望使用额外列的情况)。首先,使用“cut”删除数字会重新引入缓冲问题,因此会破坏解决方案。其次,使用“-w1”没有帮助,因为这不会将行号限制为单列 - 随着需要更多数字,它只会变得更宽。

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

#!/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}
于 2014-03-07T21:44:09.897 回答
3

使用编辑:

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

对于每一行 ( ),这会将行 ( ),的开头替换为。保存并退出。^prefixwq

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

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

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

于 2018-06-28T14:32:41.663 回答
2

这是使用此答案sed中的方法的完整示例:

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

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

前缀行

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
于 2016-03-16T13:24:46.853 回答
2
  1. 您也可以使用反向引用技术来实现这一点

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

    awk '{print "prefix"$0}' foo.txt > tmp && mv tmp foo.txt
    
于 2020-04-11T08:44:25.003 回答
2

使用Pythonize ( pz):

pz '"preix"+s' <filename
于 2021-03-22T09:56:21.837 回答
1

在带有 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
于 2021-04-18T15:19:50.113 回答
1

您可以使用AWK

echo example| awk '{print "prefix"$0}'

或者

awk '{print "prefix"$0}' file.txt > output.txt

对于后缀:awk '{print $0"suffix"}'

对于前缀和后缀:awk '{print "prefix"$0"suffix"}'

于 2022-01-11T08:57:29.223 回答
0

对于使用 BSD/OSX 系统的人来说,有一个名为 的实用程序lam,它是层压板的缩写。lam -s prefix file会做你想做的。我在管道中使用它,例如:

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

...它将找到所有文件,对每个文件执行 lam,为每个文件提供其自己文件名的前缀。(并将输出泵送到 fzf 进行搜索。)

于 2019-04-19T01:36:50.370 回答
0

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

sed -i -e 's/^.*rock.*/#&/' file_name
于 2020-12-10T19:31:02.907 回答
-1
SETLOCAL ENABLEDELAYEDEXPANSION

YourPrefix=blabla

YourPath=C:\path

for /f "tokens=*" %%a in (!YourPath!\longfile.csv)     do (echo !YourPrefix!%%a) >> !YourPath!\Archive\output.csv
于 2020-11-10T15:15:25.183 回答