1

各行の最初の文字が書式制御文字であるファイルがあり、書式制御文字を次のように編集する必要があります。

  1. 最初の行で次のように変更1します0
  2. 他のすべての行 +02+、および3に変わります+

sedこれを行うことができるコードは何ですか?

たとえば、入力ファイルには次のものがあります。

1 abcd efg
3 abcd 567
2 abcd 234
+ abcd 123

必要な結果ファイル:

0 abcd efg
+ abcd 567
+ abcd 234
0 abcd 123
4

4 に答える 4

2

これは:

sed '1{y/1/0/;b}; y/+23/0++/'

また

sed '1y/1/0/; 1!y/+23/0++/'

各行の最初の文字だけが必要な場合は、次のようにする必要があります。

sed '1/^1/s::0: ; 1!{ /^[+]/s::0:; /^2/s::+:; /^3/s::+:; }'
于 2012-08-06T18:06:24.490 に答える
1

ジョナサンの解決策は本質的に正しいですが、で区切られた複数のコマンドを適用すること;は移植性がありません。(特に、OSX上のBSDsedはそれを認識しません。)移植性のために、おそらく次のように書く方が良いでしょう。

sed -e '1s/^1/0/' -e '1!s/^+/0/' -e '1!s/^[23]/+/'

また

sed -e '1s/^1/0/'  -e '1!{
s/^+/0/
s/^[23]/+/
}'
于 2012-08-06T17:37:31.960 に答える
1

これはあなたが望むことをするはずです。

sed -e '1s/^1/0/' -e '1!s/^+/0/' -e '1!s/^[23]/+/'

最初の部分は最初の行を処理し、次の部分は + を変更し、最後の部分は 2 と 3 を処理します。エクスクラメーション マークは、「指定された行以外の行に対してこれを行う」という意味です。

于 2012-08-06T17:40:47.293 に答える
1

「制御文字」という用語は通常、「0x00 から 0x1F までの文字コード」を意味し、0x7F を含むように拡張されることもあれば、0x80 から 0x9F を含むこともあります。ただし、コンテキストでは、(レビューで) 列の最初の文字を変更する必要があることを意味していると思われます。その場合は、この少し修正されたスクリプトでうまくいくはずです。リビジョンは^、一致を各行の最初の文字に固定するために を追加します。

sed -e '1s/^1/0/' -e '2,${s/^+/0/;s/^[23]/+/;}' "$@"

最初の-eオプションは、最初の行のみで 1 を 0 に変更します。

2 番目-eは他の行を扱います。最初の代替は+to を扱い0ます。2 番目に2または3を使用し+ます。

-e単一の(または明示的な なしで)すべてを実行できますが-e、記述されているように議論はより簡単です。

于 2012-08-06T17:27:12.847 に答える