使用SED添加文本

我现在正在处理一个任务,在Unix中操作文本,但我不知道该怎么做。 我打算使用sed。 这是我正在尝试做的笏。

我有这个文本。

BS111 xxxxx yyyyy zzzzz BS112 xxxxx yyyyy zzzzz BS113 xxxxx yyyyy zzzzz so on.. with this kind of format 

我想它是这样的:

 BS111 xxxxx BS111 yyyyy BS111 zzzzz BS112 xxxxx BS112 yyyyy BS112 zzzzz BS113 xxxxx BS113 yyyyy BS113 zzzzz so on.. with this kind of format 

BS *及其数据几乎出现了几百次。 所以我认为最好的方法是使用脚本。 预先感谢您的帮助。

试试awk

awk '/^BS/{i=$0; next;} {if(length($0)) printf("%s ",i); print $0}' <filename>

更新:

“/ ^ BS / {I = $ 0; 下一页;} {if(length($ 0))printf(“%s”,i); print $ 0}“记住,在awk中, {...}表示一组操作。 /pattern/{...}表示如果找到模式,则执行{...}动作。 /^BS[0-9]/将在每行中搜索模式。 如果找到了这个模式,那么i将在模式($ 0是完整的行)中更新i (awk中的变量),然后next将会自动移动到下一行。因此, {if(...}一个模式被发现,所以i将永远包含最后的模式值,如果一行包含模式,除了更新我,下一组行动将不会发生的行。

下一组动作是, if(length($0))如果,该行包含文本, printf("%s ",i); print the last found pattern, And then printf("%s ",i); print the last found pattern, And then打印$ 0 prints the original line. So for an empty line, only an empty line is printed, if some text is there, first the prints the original line. So for an empty line, only an empty line is printed, if some text is there, first the打印我or上次找到的图案`,然后打印原始行。 顺便说一句,sputnick的解决方案也是做同样的事情,只是在一个更紧凑的形式。 所以你可以解剖一个也是为了好玩。 希望我清楚,请随时问任何你需要知道的事情

用awk:

 awk '/^BS/{v=$0;next} {print (/^$/) ? $0 : v, $0}' file.txt BS111 xxxxx BS111 yyyyy BS111 zzzzz BS112 xxxxx BS112 yyyyy BS112 zzzzz BS113 xxxxx BS113 yyyyy BS113 zzzzz 

这可能适用于你(GNU sed):

 sed -r '/^BS/{h;d};/./!b;G;s/(.*)\n(.*)/\2 \1/' file 

在sed你可以做:

 sed -n -r '/^BS[0-9]{3}/{h;d};/./G;s/(.*)\n(.*)/\2 \1/p' test.txt 

-n表示sed不会输出任何东西,除非被p命令告知。
-r表示使用扩展的正则表达式。

/^BS[0-9]{3}/{h;d}匹配以BS开始的行和三个数字, h命令将该模式放入保留缓冲区(复制它以供稍后插入)。 d命令删除匹配的行。

/./G匹配任何行。 G命令附加保持缓冲区的内容(在这种情况下是BSxxx)。 s/(.*)\n(.*)/\2 \1/p匹配当前行和下一行,切换它们并删除换行符。 最后, p命令打印结果行