1

私の目標は、プログラム コード内のすべての数学演算子の前後にスペースを追加することです。そのため、次の sed コマンドを使用します。

sed
-e 's/\([^ ->]\)\([\+=-\*]\)/\1 \2/g'
 -e 's/\([\+=-\*]\)\([^ ->]\)/\1 \2/g'"
input > output

最初の行は、スペース以外 (または not -> 演算子) とそれに続く算術演算子を検索し、スペースで区切られた両方の文字に置き換えます。もう一方は、逆の順序で文字を使用して同じことを行います。

ただし、望ましい動作とは別に、すべての大文字の間にスペースを追加します。また、オプション I (大文字と小文字を区別しない) を使用してテストしたところ、次のように、ファイル内のすべての単語がスペースで 1 文字に区切られていました。

.....d r a i n c u r r e n t w i t h o u t v e l o c i t y s a t u r a t i o n e f f e c t

予想される動作と大文字と小文字の区別との間に関係があるとは思えません。その問題に関する洞察に感謝します。

4

1 に答える 1

3

私が最初に気付いたのは、おそらくそうしたくない文字クラスの範囲で操作していることです。

[^ ->] 

上記の抜粋は、実際には「マイナス記号をエスケープしない限り、SPACE と GREATER_THAN の間にないものに一致することを意味します。たとえば、ASCII ベースのシステムでは、これには次の文字のいずれかも含まれます。!"#$%&'()*+,-./0123456789:;<=

また、私が知る限り、POSIX の正規表現構文では、実際には「"xyz" シーケンス以外のすべてに一致する」という方法は提供されていません (Perl では((?!xyz)[a-z]+)、" で始まるものを除く小文字の任意のシーケンスに一致するようなものを使用できます)。 xyz")。

ただし、使用を余儀なくされた場合にこれを回避する方法は次のsedとおりです。

mjhennig@blackbox:~$ sed \
>   -e 's/->/T_PARAM_OBJECT_ACCESS/g' \
>   -e 's/\([^\s]\)\([+\-=*]\)/\1 \2/g' \
>   -e 's/\([+\-=*]\)\([^\s]\)/\1 \2/g' \
>   -e 's/T_PARAM_OBJECT_ACCESS/->/g' <<< "alpha->prop+bravo - test=check"
alpha->prop + bravo - test = check

ご覧のとおり、欠落している、またはおそらく未知の機能は、最初に の出現箇所を置き換え、->後で元に戻すことで解決されます。

まあ、通常、これはおそらくawkorperlで解決するほうがよいでしょう。

乾杯!

于 2012-05-31T20:43:24.660 に答える