shスクリプトの文脈でこれを見てsed 's=.*/=='
混乱します。 sedマニュアルやWeb検索で代わりに使用するsed s=
方法が見つかりません。これには1つの潜在的なコマンドしか表示されませんが(現在の入力行番号の印刷)この場合、残りのコマンドは何を行いますか?s
s///
s
=
シェルでこのコマンドを実行すると、マニュアルに従って置き換えられた内容とecho 'jkfdsa=335r34'
一緒に入力と同じ出力が生成されます。echo 'jkfdsa=335r34' | sed 's/=.*/==/'
また、コマンドをecho 'jkfdsa=3' | sed 's798=.*/==/'
getsに少し変更して、元の
sed: -e expression #1, char 11: unterminated 's' command
意味が正確でなければなりません。それは何ですか?
答え1
代替区切り記号です=
。これは、パターンに/
(より一般的に使用される区切り文字)が含まれているために使用されます。ほとんどすべての文字を代替区切り文字として使用できるため、同じ意味をs@.*/@@
持ちます。s_.*/__
一般区切り記号を使用すると、sed
式は次のように書くことができます。
s/.*\///
(式が一致するテキストを/
ここでエスケープする必要があります。)またはもっと読みやすい場合
s/.*[/]//
(文字クラスのほとんどの文字はリテラル1[...]
です。)
この式の役割は、一致しないsed
項目を置き換えることです。これにより、最後の文字までを含む行内のすべての項目が削除される効果が.*/
あります。/
最も多く削除されます最後 /
.*
(最初の項目ではありません)すべての文字シーケンスに対する貪欲な一致が原因です。
例:
$ echo 'a/b/c' | sed 's/.*[/]//'
c
unterminated 's' command
テスト中のエラー
s798=.*/==/
コマンド区切り文字として7
使用されます。s
表現方式
s7.*/77
しかしそれは働く。
1 ... (最初に)や(最初のものではない場合は、2番目の後ろまたは最後)などの特別な意味を持つ文字は除外されます。との文字には特別な処理が必要ですが、これはこの質問の範囲外です。[...]
^
-
^
[
]
[...]
文字列またはシェル変数のパスの末尾にあるファイル名を取得するためにこのユーティリティが使用されている場合、このユーティリティはよりbasename
良い操作を実行できます(パスがスラッシュで終わっても正しい操作を実行します)。
$ basename a/b/c
c
$ basename a/b/c/
c
繰り返しますが、変数に改行文字が含まれていないと仮定すると、標準のシェルパラメータ置換は、コマンド置換で上記の式を介して値を渡すのと同じ効果がありますが、数倍高速です${variable##*/}
。$variable
sed
変数置換とbasename
ユーティリティも改行文字を含むパス名を正しく処理しますが、これはsed
機能しません(入力を1行ずつ処理するため)。
答え2
~からhttps://backreference.org/2010/02/20/using- Different-delimiters-in-sed/:
sedが "s"コマンドの区切り文字としてすべての文字を使用できることはよく知られていません。デフォルトでは、sedは「s」以降のすべての項目を区切り文字として扱います。
したがって、中央のスラッシュは通常の文字になります。私の解釈が正しい場合、あなたの表現は次のようになります。
s=.*/==
次のように書くこともできます。
s/.*\///
「スラッシュを含む最後のスラッシュの前のすべてのエントリを削除する」と解釈されます。
答え3
それは/
以前とそれ自体のすべてを貪欲に削除します。
例:
echo "nsi/wnx/cmedwcm" | sed 's=.*/=='
出力:
cmedwcm
ここで=
正規表現(.*/)と置換(無効)。