我有一个由序列号和数据组成的文件。我希望通过在序列号之前和之后添加许多星号和换行符来使其更具可读性。以下是该文件之前和之后的示例。
在:
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,但无法使用它。
答案 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