Unixでは、次のコマンドの機能を理解できません。
sed 's/^*//g'
私は成功せずにGoogleで検索しようとしました。どんな助けでも大変感謝します。
答え1
与えられたコマンドは、sed
各入力行の先頭から単一の文字を削除しようとします。*
このsed
ユーティリティは通常、ファイルまたはデータストリームの1行ずつテキストを変更するために使用されます。コマンドラインにファイル名オペランドが指定されていないため、質問のコマンドは標準入力ストリームを編集します。これは入力の各行に編集式を適用しますs/^*//g
。これは、正規表現に一致するすべての項目を削除する代替コマンドです^*
(または、むしろ同じ効果を持つものは置き換えません)。
式の最初の文字は、式が行の^
先頭で一致するように強制する「アンカー」です。この*
文字は通常、正規表現の「特殊」文字です(前の式が0回以上一致することを許可します。たとえば、一致ab*
するa
などab
)abb
。ただし、*
最初の文字(おそらく最初の^
アンカーの後)の場合は、リテラル文字と一致します*
。
これはPOSIXにも当てはまります。基本的なsed
(および)がデフォルトで使用する正規表現ですgrep
。sed
POSIXをサポートすることもできます。延長する*
最初(または直後^
)が次の正規表現はっきりしないエラーが発生する可能性があります。
$ 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行目に影響します。