我正在對此輸出進行練習:
; stdio.h
int fclose(file);
int feof(file);
int ferror(file);
; stdlib.h
int atexit(addr);
void exit(int);
void free(addr);
long random();
; unistd.h
void _exit(int);
int access(string,int);
uint alarm(uint);
int chdir(string);
int chown(string,int,int);
int close(int);
我必須列出 unistd.h 中所有回傳 int 并接受至少一個 int 型別引數的函式。
這就是我所做的:
sed -n '/^; unistd.h/,$p' testo.txt | awk '$0~/^int/ && $2~/int/ {print $0} '
但這并不完全正確。因為如果函式 alarm 回傳一個 int,但接受一個 uint,它會被我的 awk 選中,因為 $2~/int/。
我希望它與該模式完全匹配。我可以使用 ==,但在這個例子中它太復雜了。我可以使用 grep -w (完全匹配),但我仍然不能在這里使用它。
有什么解決辦法嗎?
uj5u.com熱心網友回復:
你的$0~/^int/表達應該是:
$1 ~ /^int$/
這樣int64_t回傳型別不匹配。你的第二個運算式應該是:
$2 ~ /[(,]int[,)]/
匹配以下任何一項:(int)— (int,— ,int,— ,int)。
一般來說,不要管sed,awk因為awk也可以。但是,在這種情況下,awk的范圍運算子,當像這樣使用時:
awk '/; unistd.h/,/^;/ { print NR ":", $0 }'
僅匹配unistd.h行,因為范圍模式的結尾也匹配與范圍模式開始匹配的行。Perl 具有行為類似的運算子和行為類似的..運算...符sed。所以,在這個例子中,似乎sed是必要的。搜索以分號開頭的下一行意味著您可以在資料之后添加更多標題,unistd.h并且仍然可以獲得分析資料的正確子集。當然,如果沒有更多行以分號開頭,它將在 EOF 處停止。
這導致:
sed -n -e '/^; unistd.h/,/^;/p' testo.txt |
awk '$1 ~ /^int$/ && $2 ~ /[(,]int[,)]/ { print $0 }'
您可以使用$1 == "int"而不是正則運算式。
這種分析確實取決于嚴格顯示的檔案格式——兩個欄位由空格分隔,沒有多余的空格。
uj5u.com熱心網友回復:
使用任何 awk:
$ cat tst.awk
sub(/^; */,"") { file = $0; next }
(file == "unistd.h") && /^int .*[(,]int[,)]/
$ awk -f tst.awk file
int access(string,int);
int chown(string,int,int);
int close(int);
或者,如果您愿意:
$ cat tst.awk
BEGIN {
FS = "[() ;,] "
}
sub(/^; */,"") {
file = $0
next
}
(file == "unistd.h") && ($1 == "int") {
for ( i=3; i<NF; i ) {
if ( $i == "int" ) {
print
next
}
}
}
$ awk -f tst.awk file
int access(string,int);
int chown(string,int,int);
int close(int);
uj5u.com熱心網友回復:
考慮:
sed -n '/^; unistd.h/,/^;/{/int [^(]\ .*[^a-z]int[^a-z]/p}'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513303.html
標籤:Cawk
上一篇:二維陣列大小(以位元組為單位)
