誰かが私の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の出力を解析すると中断されます。言及した特定のケースとは関係ありませんが、一般的に使用を避けるべきです。