bash在匹配前后添加文本

时间:2014-08-12 12:17:19

标签: bash file grep match

我有一个由序列号和数据组成的文件。我希望通过在序列号之前和之后添加许多星号和换行符来使其更具可读性。以下是该文件之前和之后的示例。

在:

SQ3000-5234646
Voltage level in range
Drive acceptable
SQ5050-9821356
CPU speed limit exceeded
Hardware valid
Unconfigured unit
SQ3000-4574886
Keyboard interrupt

后:

*******************
SQ3000-5234646
*******************

Voltage level in range
Drive acceptable

*******************
SQ5050-9821356
*******************

CPU speed limit exceeded
Hardware valid
Unconfigured unit

*******************
SQ3000-4574886
*******************

Keyboard interrupt

我尝试使用grep,但无法使用它。

4 个答案:

答案 0 :(得分:3)

您可以使用sed

$ sed '/^SQ/s|^\(.*\)$|*******************\n\1\n*******************|' t
*******************
SQ3000-5234646
*******************
Voltage level in range
Drive acceptable
*******************
SQ5050-9821356
*******************
CPU speed limit exceeded
Hardware valid
Unconfigured unit
*******************
SQ3000-4574886
*******************
Keyboard interrupt

添加-i选项以就地更改文件。


说明:

  • sed处理每一行

  • 如果当前行与正则表达式不匹配^SQ sed将按原样打印

  • 否则它会用另一个正则表达式替换行:

    • ^\(.*\)$我们收集了一行
    • 现在我们将其替换为:*******************\n\1\n*******************\1将被我们之前抓取的内容替换

答案 1 :(得分:1)

那个awk单行:

awk 'BEGIN { star = "*******************" }
     /SQ....-......./ { printf("\n%s\n%s\n%s\n\n",star, $0, star); next } 1' data
#     ^^^^^^^^^^^^^^
# The regex should match your serial number format
# here I've only guessed from your sample data

如果你真的不想要输出的第一个空行:

awk 'BEGIN { star = "*******************" }
     /SQ....-......./ { printf("%s%s\n%s\n%s\n\n", (NR>1) ? "\n" : "", star, $0, star); next } 1' data
#                                                  ^^^^^^^^^^^^^^^^^^
#                                        only output the start empty line if
#                                            this is not the first line

答案 2 :(得分:1)

这是awk

awk '/^SQ[0-9]/ {$0=v$0v}1' v="\n*******************\n" file

*******************
SQ3000-5234646
*******************

Voltage level in range
Drive acceptable

*******************
SQ5050-9821356
*******************

CPU speed limit exceeded
Hardware valid
Unconfigured unit

*******************
SQ3000-4574886
*******************

Keyboard interrupt

答案 3 :(得分:0)

以下是使用Awk进行此操作的另一种方法:

BEGIN{
    for(;i<19;i++)
        r=r"*"
}
{
    if($1 ~ /^SQ[0-9]{4}-[0-9]{7}$/) 
        print "\n"r"\n"$0"\n"r"\n"
    else
        print
}

运行脚本:

user@prompt$ awk -f script.awk file

*******************
SQ3000-5234646
*******************

Voltage level in range
Drive acceptable

*******************
SQ5050-9821356
*******************

CPU speed limit exceeded
Hardware valid
Unconfigured unit

*******************
SQ3000-4574886
*******************

Keyboard interrupt