1

sed スクリプトに問題があります。上記のスクリプトを使用してこのデータを処理します。

問題は、スクリプトの次の行です。

/^$/d
s/ $/ajes/g

動作しません。もちろん、データを再処理すれば機能します。

これは機能しません:

sed -f script.sed -i data.file

しかし、これは機能します(二重処理):

sed -f script.sed -i data.file
sed -f script.sed -i data.file

何故ですか?問題はどこですか?すべての結果を一度に処理できないのはなぜですか?

4

2 に答える 2

2

本当の問題は、1 行しかないことです。そして、sedそれを一度読み取り、各コマンドを 1 つずつ実行しようとしますが、行全体がパターン空間にあります。何かを置き換えると、\nそれはまだ 1 つの文字列であり、パターン スペースにあります。複数の文字列に分割されず、1 つずつ読み直されました。

明らか/^$/にあなた\n\nと一致s/ $/ajes/gせず、前の任意のスペースとも一致しません\n。それが、期待どおりに機能しない理由です。

「機能しない」コマンドを次のように変更することで、問題を解決できます。

s/\n\+/\n/g # equals to /^$/d
s/ \n/ajes\n/g # equals to s/ $/ajes/g
于 2012-08-15T10:36:58.150 に答える
1

そこには多くの代替品があります。代替品があるとしましょう

  • ルールA
  • ルールB
  • ルール C.

したがって、ここでの問題は、ルール Aが最初に一致せず、次にルール B または C が一致して、置換後に再び A と一致するパターンになった場合、その行に対してルール A が有効にならないことです。したがって、置換が処理される順序を分析する必要があり、うまくいけば間違いを見つけることができます。

これが適切な方向に役立つことを願っています。

于 2012-08-15T10:16:31.487 に答える