GNU sed: 名前の開始前と名前の末尾の後に追加 (出力: "$ls -xN")

GNU sed: 名前の開始前と名前の末尾の後に追加 (出力:

誰かが私のGNUsedスクリプトがこれを行うのに最適な方法であるのか、それとも悪い/間違ったハックなのかを確認できますか? p

$ ls -xN
1
2
3
4
$ ls -xN | sed -E "s/(.{1})$/\1\.log/" | sed -E "s/^(.{1})/Day\ \1/"
Day 1.log
Day 2.log
Day 3.log
Day 4.log

sedなぜ知らないのか分からない\n新しいチーム)と\sスペース):

  • 新しいチーム:
    • を使用したいが、使用する必要があり\nます。.{1}$
  • スペース:
    • を使用したいが、使用する必要があり\sます。\

ベストアンサー1

GNUsed認識\n\s。ただし、\s少なくとも空白、改行(別名改行)、タブ、フォームフィード、垂直タブ、およびキャリッジリターンと一致する「すべての空白文字」を意味しますが、ロケールにはより多くのものがある可能性があります。標準文字クラスと同じです[[:space:]]。 1文字ではなく複数の文字なので、あいまいでsed何を挿入したいのかわからないため、代替演算子の右側には使用できません。しかし、左側ではうまくいきます。

$ printf '[space]: [tab]:\t[CR]:\r[FF]\f\n'
[FF]ce]: [tab]: [CR]:

$ printf '[space]: [tab]:\t[CR]:\r[FF]\f\n' | sed 's/\s/MATCH/g'
[space]:MATCH[tab]:MATCH[CR]:MATCH[FF]MATCH
$

あるいは、エスケープせずに単純なスペースを使用することもできます。

$ printf '%s\n' {1..4} | sed -E 's/^(.{1})/Day \1/'
Day 1
Day 2
Day 3
Day 4

次に、GNUはsed改行文字をよく認識します。ここではそれがどのように関連しているのか理解できません。$「行の終わりと一致」を意味します。\n必要に応じて交換できます。たとえば、

$ printf '%s\n' {1..4} | sed -zE 's/(.)\n/\1.log\n/g'
1.log
2.log
3.log
4.log

あなたの質問のユーザーケースとは関係がないようです。最後に、1回の操作ですべての操作を実行できます。

$ printf '%s\n' {1..4} | sed -E 's/(.)/Day \1.log/'
Day 1.log
Day 2.log
Day 3.log
Day 4.log

最後のポイントはほとんど良い考えではありませんls少し奇妙なファイル名があってもasの出力を解析すると中断されます。言及した特定のケースとは関係ありませんが、一般的に使用を避けるべきです。

おすすめ記事