我有一个文件如下:
line1
line2
line3
我想得到:
prefixline1
prefixline2
prefixline3
我可以编写一个 Ruby 脚本,但如果我不需要的话会更好。
prefix
将包含/
. 例如,它是一条路径/opt/workdir/
。
我有一个文件如下:
line1
line2
line3
我想得到:
prefixline1
prefixline2
prefixline3
我可以编写一个 Ruby 脚本,但如果我不需要的话会更好。
prefix
将包含/
. 例如,它是一条路径/opt/workdir/
。
# 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
contains /
,您可以使用任何其他不在的字符prefix
,或者转义/
,因此sed
命令变为
's#^#/opt/workdir#'
# or
's/^/\/opt\/workdir/'
awk '$0="prefix"$0' file > new_file
在 awk 中默认的动作是'{print $0}'
(即打印整行),所以上面的等价于:
awk '{print "prefix"$0}' file > new_file
使用 Perl(就地替换):
perl -pi 's/^/prefix/' file
你可以在 Ex 模式下使用 Vim:
ex -sc '%s/^/prefix/|x' file
%
选择所有行
s
代替
x
保存并关闭
如果您的前缀有点复杂,只需将其放入变量中:
prefix=path/to/file/
然后,您传递该变量并让 awk 处理它:
awk -v prefix="$prefix" '{print prefix $0}' input_file.txt
如果你有 Perl:
perl -pe 's/^/PREFIX/' input.file
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
使用 & (与模式匹配的整个输入部分”):
cat in.txt | sed -e "s/.*/prefix&/" > out.txt
或使用反向引用:
cat in.txt | sed -e "s/\(.*\)/prefix\1/" > out.txt
使用外壳:
#!/bin/bash
prefix="something"
file="file"
while read -r line
do
echo "${prefix}$line"
done <$file > newfile
mv newfile $file
虽然我不认为 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}
使用编辑:
ed infile <<'EOE'
,s/^/prefix/
wq
EOE
对于每一行 ( ),这会将行 ( ),
的开头替换为。保存并退出。^
prefix
wq
如果替换字符串包含斜杠,我们可以使用不同的分隔符来s
代替:
ed infile <<'EOE'
,s#^#/opt/workdir/#
wq
EOE
我引用了 here-doc 分隔符EOE
(“ed 结束”)以防止参数扩展。在这个例子中,它也可以不加引号地工作,但是如果你$
的 ed 脚本中有 a ,这是防止意外的好习惯。
这是使用此答案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
您也可以使用反向引用技术来实现这一点
sed -i.bak 's/\(.*\)/prefix\1/' foo.txt
您也可以像这样使用 awk
awk '{print "prefix"$0}' foo.txt > tmp && mv tmp foo.txt
使用Pythonize ( pz
):
pz '"preix"+s' <filename
在带有 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
您可以使用AWK
echo example| awk '{print "prefix"$0}'
或者
awk '{print "prefix"$0}' file.txt > output.txt
对于后缀:awk '{print $0"suffix"}'
对于前缀和后缀:awk '{print "prefix"$0"suffix"}'
对于使用 BSD/OSX 系统的人来说,有一个名为 的实用程序lam
,它是层压板的缩写。lam -s prefix file
会做你想做的。我在管道中使用它,例如:
find -type f -exec lam -s "{}: " "{}" \; | fzf
...它将找到所有文件,对每个文件执行 lam,为每个文件提供其自己文件名的前缀。(并将输出泵送到 fzf 进行搜索。)
如果您需要在具有特定字符串的每一行的开头添加一个文本,请尝试以下操作。在下面的示例中,我在每行包含“rock”一词的开头添加#。
sed -i -e 's/^.*rock.*/#&/' file_name
SETLOCAL ENABLEDELAYEDEXPANSION
YourPrefix=blabla
YourPath=C:\path
for /f "tokens=*" %%a in (!YourPath!\longfile.csv) do (echo !YourPrefix!%%a) >> !YourPath!\Archive\output.csv