我有一段时间使用if条件来检查我的行是否以特定字符串开头:
while read line; do
# reading each line
if [[ $line == P0* ]]
then
echo $line
fi
我想添加一个条件以确保在我的";P0*";行不包含特定字符串:;PIC S9";。
例如:
P00001 05 ID-TECH-DPR
PIC S9(9) COMP.
P00005 05 ID-TECH-INDV
PIC S9(9) COMP.
P00009 05 CO-REG-LIQ PIC X(1).
P00010 05 NO-INST-LIQ PIC X(3).
P00013 05 NO-ORD-DPR
我需要我的输出是:
P00009 05 CO-REG-LIQ PIC X(1).
P00010 05 NO-INST-LIQ PIC X(3).
P00013 05 NO-ORD-DPR
代替:
P00001 05 ID-TECH-DPR
P00005 05 ID-TECH-INDV
P00009 05 CO-REG-LIQ PIC X(1).
P00010 05 NO-INST-LIQ PIC X(3).
P00013 05 NO-ORD-DPR
我会用AWK来做。尝试:
#!/bin/bash
awk '
(s != ""){if ($0 !~ /PIC S9/) {print s}; s=""}
/^P0/{s=$0}
' srce
假设文件srce
包含:
P00001 05 ID-TECH-DPR
PIC S9(9) COMP.
P00005 05 ID-TECH-INDV
PIC S9(9) COMP.
P00009 05 CO-REG-LIQ PIC X(1).
P00010 05 NO-INST-LIQ PIC X(3).
P00013 05 NO-ORD-DPR
除非您实际上出于其他原因需要寻址bash中的每一行,否则只需执行
grep ^P0 my-file | grep -v '^[[:space:]]*PIC S9'
或者在awk中,你可以做同样的事情,但也可以在awk:中寻址每一行
awk '/^P0/ && !/^[[:space:]]*PIC S9/' my-file
在bash中,您可以添加第二个测试,但bash-regex速度较慢:
if [[ $line == P0* && ! $line =~ ^[[:space:]]*PIC S9 ]]
then