sedコマンドについて知りたい
たとえば、次のコマンドがあります。
rtNum=`pwd | sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//'`
そして
rtRun=`pwd | sed -e 's/^.*bbsp.\/rt.*\///'`
ここで pwd は次のようになります。/tfsrun/bbsp2/rt3/run
生成される出力は次のとおりです。
echo $rtNum
3
そして
echo $rtRun
run
-e
上記のsedコマンド、特に上記のsedコマンドでは、/、//および///の使い方と使い方を理解したいと思います。
答え1
マニュアルに記載されているように、この-e
オプションはスクリプトが続くことを示します。スクリプトは正規表現を使用して、一致するコンテンツを空の文字列に置き換えます。
正規表現を理解するには、次を読むのに十分な時間を費やすことをお勧めします。https://www.tutorialspoint.com/unix/unix-regular-expressions.htm
あなたの質問に:
\/
スラッシュはエスケープされていますか?これは区切り文字として扱われないことを意味します。
/
一致文字列とターゲット文字列を区切る区切り文字です。
たとえば、's/matchingstring/targetstring/'
s 呼び出しは一致する文字列の最初の項目をターゲット文字列に置き換えます。
あなたの場合:
'//'
区切り文字の間に何もないため、ターゲット文字列が空であることを示します。'///'
実際にそうです。'\///'
これは、一致文字列がスラッシュで終わり、ターゲット文字列が空であることを意味します。
答え2
-e
toフラグはsed
「これを実行/実行」する方法です。sed
同じ呼び出しで複数の編集コマンドを実行するには、このコマンドが必要ですsed
(区切りがない限り)。;
たとえば、ファイルから1行と20〜30行のみを抽出/印刷するには(この-n
フラグは各入力行のデフォルト出力をオフにします):
$ sed -n -e '1p' -e '20,30p'
では、sed
単一のスラッシュ()を使用して正規表現を区切ります。/
たとえば、同じ行の「hello」文字列の後に「word」が続くすべての行を削除します。
$ sed '/hello.*world/d'
場合によっては、代替項目に二重スラッシュが表示されることがあります。コマンドの実行は、正規表現に一致するコンテンツを文字列にs
置き換えます。sed
s/pattern/replacement/
意図なら削除パターンと一致するもの、交換は空になり、私たちは次のように終わります。
s/pattern//
トリプルスラッシュ(///
)は、パターンを削除したい人から来たものです。スラッシュで終わる。スラッシュは区切り文字として使用されるため、最初のスラッシュは次のようになります。脱出するバックスラッシュ()で\/
構成されています\///
。 「エスケープ済み」とは、「区切り文字ではなく文字通りの文字として処理される」を意味する。
代替操作を実行するときに厄介なスラッシュの問題を解決する方法はいくつかありますsed
。選択肢を選ぶ
s/\///
/
これにより、各行の最初の行が削除されます(実際には空のものと交換)。
もう一つの方法は書き込みです。
s/[/]//
スラッシュを文字グループに入れるか、角かっこ表現。これらのグループ内のすべての文字は常にリテラル文字として扱われますsed
。角かっこ式のみが一致します。一つ文字はそこにリストされている文字を超えています。
別の方法は、異なる区切り文字を使用することです。
s#/##
ここで#
、文字は区切り文字として機能します(すべての文字を選択できます)。#
区切り文字として使用するときにaを一致させるには、デフォルトの区切り文字を使用するときと同じか、またはいずれかを#
使用する必要があります。\#
[#]
/
それでは、sed
コマンドラインを確認してください。
sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//'
これにより、2つの編集作業が実行されます。
s/^.*bbsp.\/rt//
またはs#^.*bbsp./rt##
s/\/.*$//
またはs#/.*$##
どちらも置換(s
の編集コマンドsed
)であり、どちらも一致するパターンを何も変更しません。つまり、どちらも入力から何かを削除します。
最初のパターンは、^.*bbsp.\/rt
行の先頭(^
)から始まり、任意の数の文字(.*
)、文字列bbsp
、その他の文字(.
)、および文字列の後に続くものと一致します/rt
。
したがって、すべての文字を表すafterを/rt
含むその行のすべての内容を削除するようです。bbsp.
.
2番目のパターンはaから行末まで()まで一致\/.*$
します。/
$
だから1行のテキストが与えられました。
/tfsrun/bbsp2/rt3/run
最初の置換は次のように変わります。
3/run
2番目はそれを次のように変更します。
3
答え3
ここにあなたの見積もりがありますman sed
-e スクリプト、 --expression=スクリプト
add the script to the commands to be executed
s/正規表現/交換/
Attempt to match regexp against the pattern space. If successful, replace that portion matched with replacement. The replacement may contain the special character & to refer to that portion of the pattern space which matched, and the special escapes \1 through \9 to refer to the corresponding matching sub-expressions in the regexp.