sed 's/^*//g'は何をしますか?

sed 's/^*//g'は何をしますか?

Unixでは、次のコマンドの機能を理解できません。

sed 's/^*//g'

私は成功せずにGoogleで検索しようとしました。どんな助けでも大変感謝します。

答え1

与えられたコマンドは、sed各入力行の先頭から単一の文字を削除しようとします。*

このsedユーティリティは通常、ファイルまたはデータストリームの1行ずつテキストを変更するために使用されます。コマンドラインにファイル名オペランドが指定されていないため、質問のコマンドは標準入力ストリームを編集します。これは入力の各行に編集式を適用しますs/^*//g。これは、正規表現に一致するすべての項目を削除する代替コマンドです^*(または、むしろ同じ効果を持つものは置き換えません)。

式の最初の文字は、式が行の^先頭で一致するように強制する「アンカー」です。この*文字は通常、正規表現の「特殊」文字です(前の式が0回以上一致することを許可します。たとえば、一致ab*するaなどababb。ただし、*最初の文字(おそらく最初の^アンカーの後)の場合は、リテラル文字と一致します*

これはPOSIXにも当てはまります。基本的なsed(および)がデフォルトで使用する正規表現ですgrepsedPOSIXをサポートすることもできます。延長する*最初(または直後^)が次の正規表現はっきりしないエラーが発生する可能性があります。

$ sed -E 's/^*//g'
sed: 1: "s/^*//g": RE error: repetition-operator operand invalid

結局、g何も動作しませんでした。このフラグは、「行内で重複しないすべての一致に対して繰り返し置換」を意味しますが、式は行の先頭に固定されているため、一致する^項目は1つだけです。

例:

$ printf '%s\n' 'a*a' 'bb*' '***' '*abc'
a*a
bb*
***
*abc

私たちの式は、上記の最後の2行の先頭から1行を削除するsedと予想されます。*

$ printf '%s\n' 'a*a' 'bb*' '***' '*abc' | sed 's/^*//'
a*a
bb*
**
abc

g最後に追加しても違いはないことをお見せします。

$ printf '%s\n' 'a*a' 'bb*' '***' '*abc' | sed 's/^*//g'
a*a
bb*
**
abc

このフラグはアンカーを削除するまで適用されませんg

$ printf '%s\n' 'a*a' 'bb*' '***' '*abc' | sed 's/*//g'
aa
bb

abc

この特定の変更は、以下を介してより効率的に行われます。

tr -d '*'

リテラル文字は基本正規表現で最初に一致するため、*行末アンカーを使用する*式は行末の単一文字と一致します。したがって、以下は行末の文字を削除する方法を示しています。*$$**

$ printf '%s\n' 'a*a' 'bb*' '***' '*abc' | sed 's/*$//'
a*a
bb
**
*abc

ご覧のとおり、これはサンプルデータの2行目と3行目に影響します。

関連情報