我有一个文件如下:
line1
line2
line3
我想得到:
prefixline1
prefixline2
prefixline3
我可以编写一个Ruby脚本,但是如果不需要的话更好。
prefix
将包含/
。/opt/workdir/
例如,这是一条路径。
我有一个文件如下:
line1
line2
line3
我想得到:
prefixline1
prefixline2
prefixline3
我可以编写一个Ruby脚本,但是如果不需要的话更好。
prefix
将包含/
。/opt/workdir/
例如,这是一条路径。
Answers:
# 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/'
sed
在管道中使用,例如foo | sed -e 's/^/x /' | bar
。
sed -e '2,$s/^/prefix/'
。
sed -e 's/$/postfix/' file
如果要在每行末尾添加字符串,请使用。
awk '$0="prefix"$0' file > new_file
使用Perl(就地替换):
perl -pi 's/^/prefix/' file
prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
awk
报告awk: out of memory in readrec 1 source line number 1
,但是解决方案sed
已成功完成。
您可以在Ex模式下使用Vim:
ex -sc '%s/^/prefix/|x' file
%
选择所有行
s
更换
x
保存并关闭
:%s/^/prefix/
,因为这种策略最终在许多情况下都是有用的
这是一个使用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
尽管我不认为pierr会担心这一点,但我需要一种不会延迟文件实时“尾部”输出的解决方案,因为我想同时监视多个警报日志,并在每行之前添加其各自日志的名称。
不幸的是,sed,cut等引入了过多的缓冲,使我无法查看最新的行。史蒂芬竹篙建议使用-s
的选项nl
很有趣,测试证明,它没有引入与我有关的不必要的缓冲。
nl
但是,使用会带来一些问题,这与去除不需要的行号的需求有关(即使您不关心它的美观性,在某些情况下,使用多余的列也是不希望的)。首先,使用“剪切”去除数字会重新引入缓冲问题,因此会破坏解决方案。其次,使用“ -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}
-u
sed选项来避免缓冲。
您也可以使用反向引用技术来实现
sed -i.bak 's/\(.*\)/prefix\1/' foo.txt
您也可以这样使用awk
awk '{print "prefix"$0}' foo.txt > tmp && mv tmp foo.txt
这是一个使用此答案中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
PREFIX
包含任何特殊字符(如斜杠),则此功能将不起作用。
prefix_lines \*
sed
执行此类轻量级任务。如果知道“前缀”,则很容易从“前缀”中选择一个字符。