파일이 다음 패턴을 따르는지 확인하고 싶습니다.
... ... ... foo ... foo_KO ... ...
... bar ... ... ... ... bar_KO ...
파일이 매우 길기 때문에 즉, 다음 규칙을 보장하고 싶습니다 sed
.
([az]*)_KO가 일치할 때마다 같은 줄에 \1 값을 갖는 또 다른 필드가 있게 됩니다.
나는 충분히 명확하기를 바랍니다.
저는 ksh를 사용하는 Solaris 10을 사용하고 있습니다.
예:
입력하다
... ... ... foo ... foo_KO ... ...
... bar ... ... ... ... bar_KO ...
산출
valid
입력하다
... ... ... foo ... foo_KO ... ...
... bar ... ... ... ... bar_KO ...
... fubar_KO ... ... ... ... ...
산출
invalid line 3
또는
unmatched pattern fubar_KO
답변1
그러면 잘못된 줄의 줄 번호가 인쇄됩니다.
sed -n '/\([a-z]\+\).*\1_KO/b;/\([a-z]\+\)_KO.*\1/b;=' input_file
그러나 한 줄에 여러 개의 "_KO"를 처리하지 않습니다.
이는 더욱 안정적이고 이식성이 뛰어납니다.
awk '{for(i=1;i<=NF;i++)if((s=$i)~/^([a-z]+)_KO/){sub(/_KO$/,"",s);o=0;for(j=1;j<=NF;j++)if($j==s)o=1;if(!o)printf"line %d unmatched %s\n",NR,s}}' input_file
이는 더 까다롭고 효율적이며 여러 모드를 지원하지만 순서에 따라 로캘이 성공에 영향을 미칠 수 있습니다.
ruby -nae '$F.sort!.select!{|v|v=~/^[a-z]+(_KO)?$/};$F.each_with_index{|v,k|puts"line #{$.} unmatched #{v}"if v[/^([a-z]+)_KO$/]and$F[k-1]!=$1}' input_file
기본적으로 위와 동일한 솔루션 awk
이지만 덜 장황해 보입니다 perl
.
perl -nae 'for$k(grep/^[a-z]+_KO$/,@F){print"line $. unmatched $k\n"unless grep{$_ eq substr$k,0,-3}@F}' input_file
답변2
신비한 Perl:
perl -ne '/(\w+)_KO\b/ && !/\b$1(?!_KO)\b/ && print "invalid line $.: missing $1\n"' filename
/(\w+)_KO\b/
"_KO" 단어를 찾아 KO가 아닌 부분을 변수에 캡처합니다. $1
!/\b$1(?!_KO)\b/
_KO(단어 경계) 없이 "독립형" 단어가 없으면 \b
true 입니다.
두 조건이 모두 true이면 오류 메시지를 인쇄합니다.
파일이 "유효"한지 확인하려면 다음을 수행하십시오.
output=$(perl -ne '/(\w+)_KO\b/ && !/\b$1(?!_KO)\b/ && print "invalid line $.: missing $!\n"' filename)
[ -z "$output" ] && echo valid
또는
perl -ne '
BEGIN {$count = 0}
if (/(\w+)_KO\b/ && !/\b$1(?!_KO)\b/) {print "invalid line $.: missing $!\n"; $count++}
END {$count == 0 && print "valid\n"}
' filename