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

2024-10-10 08:38:00
admin
原创
221
摘要:问题描述:我有如下文件:line1 line2 line3 我想要得到:prefixline1 prefixline2 prefixline3 我可以编写一个 Ruby 脚本,但如果不需要就更好了。prefix将包含。例如/,它是一条路径。/opt/workdir/解决方案 1:# If you want t...

问题描述:

我有如下文件:

line1
line2
line3

我想要得到:

prefixline1
prefixline2
prefixline3

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

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


解决方案 1:

# 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/'

解决方案 2:

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

在 awk 中默认操作是'{print $0}'(即打印整行),因此上述操作等同于:

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

使用 Perl(就地替换):

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

解决方案 3:

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

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

  2. s代替

  3. x保存并关闭

解决方案 4:

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

prefix=path/to/file/

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

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

解决方案 5:

ts以下是使用moreutils 命令的单行解决方案

$ cat file | ts prefix

以及它是如何一步步推导出来的:

# Step 1. create the file

$ cat file
line1
line2
line3
# Step 2. add prefix to the beginning of each line

$ cat file | ts prefix
prefix line1
prefix line2
prefix line3

请注意,前缀将与内容用空格分隔

解决方案 6:

如果你有 Perl:

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

解决方案 7:

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

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

或者使用反向引用:

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

解决方案 8:

使用 shell:

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

解决方案 9:

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

不幸的是,sed、cut 等引入了太多缓冲,使我无法看到最新的行。Steven Penny 建议使用选项-snl这很有意思,而且测试证明它没有引入我担心的不必要的缓冲。

不过,使用 时存在一些问题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}

解决方案 10:

使用 ed:

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

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

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

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

我已将此处文档分隔符(“ed 结束”)括起来以防止参数扩展。在此示例中,不带引号也可以正常工作,但如果您的 ed 脚本中EOE有一个,则最好避免出现意外。$

解决方案 11:

下面是使用此答案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

解决方案 12:

  1. 您还可以使用反向引用技术来实现这一点

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

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

解决方案 13:

你可以使用AWK来实现

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

或者

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

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

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

解决方案 14:

使用Pythonize ( pz):

pz '"preix"+s' <filename

解决方案 15:

在 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

解决方案 16:

对于使用 BSD/OSX 系统的用户,有一个名为的实用程序lam,是 Laminate 的缩写。lam -s prefix file它将执行您想要的操作。我在管道中使用它,例如:

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

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

解决方案 17:

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

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

解决方案 18:

另一种选择(sponge可选):

$ cat file | xargs -I{} echo 'prefix-{}-suffix' | sponge file

例子:

$ seq 1 10 | xargs -I{} echo 'prefix-{}-suffix'
prefix-1-suffix
prefix-2-suffix
prefix-3-suffix
prefix-4-suffix
prefix-5-suffix
prefix-6-suffix
prefix-7-suffix
prefix-8-suffix
prefix-9-suffix
prefix-10-suffix

解决方案 19:

SETLOCAL ENABLEDELAYEDEXPANSION

YourPrefix=blabla

YourPath=C:path

for /f "tokens=*" %%a in (!YourPath!longfile.csv)     do (echo !YourPrefix!%%a) >> !YourPath!Archiveoutput.csv
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1120  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   75  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   66  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   76  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   70  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用