在每行开头添加前缀字符串
- 2024-10-10 08:38:00
- admin 原创
- 93
问题描述:
我有如下文件:
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
%
选择所有行s
代替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 建议使用选项-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}
解决方案 10:
使用 ed:
ed infile <<'EOE'
,s/^/prefix/
wq
EOE
对于每一行 ( ),用 替换,
行的开头 ( ^
) prefix
。wq
保存并退出。
如果替换字符串包含斜杠,我们可以使用不同的分隔符来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:
您还可以使用反向引用技术来实现这一点
sed -i.bak 's/(.*)/prefix/' foo.txt
您还可以像这样使用 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
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件