2011-07-05 126 views
1

(我使用BSD桑達)可以sed做到這一點嗎?

這個bash腳本:

sed -E -f parsefile < parsewords.d 

使用此命令文件:

# Delete everything before BEGIN RTL and after END RTL 
\?/\* BEGIN RTL \*/?,\?/\* END RTL \*/?!d 

# Delete comments unless they begin with /*! 
s?/\*[^!].*\*/??g  

# Delete blank lines 
/^[  ]*$/d 

# Break line into words 
s/[^A-Za-z0-9_]+/ /g 

# Remove leading and trailing spaces and tabs 
s/^[ ]*(.*)[  ]*$/\1/ 

有了這個輸入文件:

any stuff 
/* BEGIN RTL */ 

/*! INPUTS: a b c d ph1 */ /* Comment */ 
x = a && b || c && d; 

    y = x ? a : b; /* hello */ 
z = ph1 ? x : z; 
    w = c || x || (z || d); 
/* END RTL */ 

生成此結果:

INPUTS a b c d ph1 
x a b c d 
y x a b 
z ph1 x z 
w c x z d 

這很好,到目前爲止,但我真的很想有是這樣的:

x = a && b || c && d; x a b c d 
y = x ? a : b; y x a b 
z = ph1 ? x : z; z ph1 x z 
w = c || x || (z || d); w c x z d 

使原線與腳本正在MODS的一起保留。

這可能與sed或我應該使用別的東西。 (任何其他意見也歡迎。)

編輯:這不是一個解析問題。這是關於保留原始輸入行以及sed修改。

+0

答:什麼是詞法分析器?問:我應該用什麼來解析這個問題。另請參閱yacc,野牛等 –

+0

@Nathan:但解析工作正常。唯一的問題是保留原始輸入行。 – grok12

+0

如果不需要解析,也許使用awk而不是sed可以幫助解決您的任務。 – mkro

回答

4

使用'sed'的解決方案。

輸入文件(INFILE):

any stuff 
/* BEGIN RTL */ 

/*! INPUTS: a b c d ph1 */ /* Comment */ 
x = a && b || c && d; 

    y = x ? a : b; /* hello */ 
z = ph1 ? x : z; 
    w = c || x || (z || d); 
/* END RTL */ 

'桑達' 計劃(script.sed):

# Delete everything before BEGIN RTL and after END RTL 
\?/\* BEGIN RTL \*/?,\?/\* END RTL \*/?!d 

# Delete comments unless they begin with /*! 
s?/\*[^!].*\*/??g  

# Delete blank lines 
/^[  ]*$/d 

# Copy current line in hold space. 
h 

# Break line into words 
s/[^A-Za-z0-9_]+/ /g 

# Join both lines with a ';'. 
H ; g ; s/\n//; s/;\s+/;/

# Remove leading and trailing spaces and tabs 
s/^[ ]*(.*)[  ]*$/\1/ 

執行:

$ sed -E -f script.sed infile 

輸出(我不明白用'INPUTS'這個單詞的行,但是改變腳本以適應它):

/*! INPUTS: a b c d ph1 */ INPUTS a b c d ph1 
x = a && b || c && d; x a b c d 
y = x ? a : b; y x a b 
z = ph1 ? x : z; z ph1 x z 
w = c || x || (z || d); w c x z d 
+0

非常好,Birei,非常好! – grok12

0

我會說使用sed這種任務將證明是困難的。

也許你需要考慮解析/ lexing?

相關問題