以下の形態のパターンが与えられた。
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
コマンドはラベルに分岐します。 (条件は「移動」です。):a
s
答え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\text
sh
このコードスニペットは、パラメータ拡張${parameter//pattern/string}
(POSIX標準拡張)をサポートするすべてのシェルから文字列を印刷します。
awk
これはコードをやや模倣することです。