キャプチャグループの文字をsedに置き換える方法

キャプチャグループの文字をsedに置き換える方法

以下の形態のパターンが与えられた。

a\b\c\d:text\text

sed 出力の使用方法

a/b/c/d:text\text

つまり、バックスラッシュ、コロン、ランダムテキストを順番に使用するパスがある場合、コロンの前のバックスラッシュだけをスラッシュに置き換えるにはどうすればよいですか?

答え1

これを行う方法はいくつかあります。

sed -e ':a' -e 's_^\([^:]*\)\\_\1/_;t a'

ナビゲーションガイドライン:

-e編集コマンドを指定します。これには2つのコマンドがあります。

:a「goto」ステートメントで使用できるラベルを定義します。

このsコマンドは、最初のバックスラッシュがコロン文字の前に表示される1行の最初のバックスラッシュをスラッシュに置き換えます。

このコマンドを使用して交換が成功すると、t aコマンドはラベルに分岐します。 (条件は「移動」です。):as

答え2

awk代わりに使用してくださいsed

awk -v FS=':' -v OFS=':' '{ gsub(/\\/,"/",$1) } { print }'

これにより、データを:--delimited レコードとして処理し、gsub()最初のフィールドのすべてのバックスラッシュをスラッシュに置き換えます。その後、変更されたデータを出力します。

入力フィールド区切り記号(FS)と出力フィールド区切り記号(OFS)を設定して、入力を:コロンに分割し、後で出力が発生したときにコロンを再挿入するように設定しました。


シェル変数にテキストがある場合は、外部ユーティリティを使用せずにシェルから直接これを実行できます。

a='a\b\c\d:text\text'
b=${a%%:*}  # the start of the string ("remove the first : and everything after it from $a")
c=${a#*:}   # the end of the string ("remove the first : and everything before it from $a")

a="${b//\\//}:$c"

printf '%s\n' "$a"

a/b/c/d:text\textshこのコードスニペットは、パラメータ拡張${parameter//pattern/string}(POSIX標準拡張)をサポートするすべてのシェルから文字列を印刷します。

awkこれはコードをやや模倣することです。

関連情報