除了SED提取之外,如何打印一些自由文本

时间:2016-07-07 18:46:03

标签: sed

众所周知的SED命令,用于提取第一行并打印到另一个文件

sed -n '1 p' /p/raw.txt | cat >> /p/001.txt ;

在/p/001.txt中输出

John Doe

但是如何修改上面的命令来添加一些自由文本,例如,输出像

Name: John Doe

感谢任何提示尝试。

2 个答案:

答案 0 :(得分:3)

您可以在一个命令中执行此操作(并且没有子shell):

sed 's/^/Name: /;q' /p/raw.txt >> /p/001.txt

在第一行前面加上“Name:”前缀,打印出来,然后退出,这样就不会处理其他行。在q之前添加一个行号,以打印所有行(包括该号码)。输出附加到/p/001.txt,就像您的原始代码一样。

如果你想要一系列的行:

sed -n '3,9{s/^/Name: /;p}9q' /p/raw.txt >> /p/001.txt

从第3-9行读取,执行替换,打印,然后在第9行之后退出。

如果你想要特定的线条,我推荐awk:

awk 'NR==3 || NR==9 { print "Name: " $0 } NR>=9 { exit }' /p/raw.txt >> /p/001.txt

这有两个条款。一个说记录的数量(行号)是3或9,在这种情况下我们打印前缀和行。另一个告诉我们在第9条记录之后停止阅读文件。

以下是另外两个命令,用于显示awk如何仅对第一行或给定范围起作用:

awk '{ print "Name: " $0 } NR >= 1 { exit }' /p/raw.txt >> /p/001.txt
awk '3 <= NR { print "Name: " $0 } NR >= 9 { exit }' /p/raw.txt >> /p/001.txt

看来你正在不断地从另一个文件构建一个文件。考虑:

tail -Fn0 /p/raw.txt |sed 's/^/Name: /' >> /p/001.txt

这将连续运行,只添加新条目(在命令运行后添加)到/p/001.txt

也许你有很多重复要解决的问题?

awk 'NR != FNR { $0 = "Name: " $0 } !s[$0]++' \
  /p/001.txt /p/raw.txt > /tmp/001.txt && mv /tmp/001.txt /p/001.txt

这将先前保存的名称与任何新名称折叠在一起,仅打印一次名称(!s[$0]++为零时为s[$0]为真(默认状态)),但在评估后,它会增加到1在第二次出现时将其设为false。当一个裸子句没有动作时,就会打印该行。)因为我们正在读取输出文件,所以我们需要一个临时输出。成功完成后,我们将其移动到目标输出文件的顶部。

答案 1 :(得分:1)

 printf "Name : %s\n" "$(sed -n '1p;q' /p/raw.txt)" >/p/001.txt

应该这样做。如果sed不是必需的,那么

echo -e "Name : $(sed -n '1p;q' /p/raw.txt)" >/p/001.txt

注意

  1. q sed选项退出,不再处理任何命令或输入。
  2. -e选项告诉echo解释转义序列。这是bash shell的特色。