たとえば、ファイル内のハイフンを下線に置き換える方法を知っています。
しかし、与えられたファイル内の山かっこ内のすべてのテキストに対して、すべてのハイフンを下線に置き換えたいと思います。
たとえば、次のファイルは次のようになります。
<charset-params>
<input-charset>
<resource-path>/*</resource-path>
<java-charset-name>UTF-8</java-charset-name>
</input-charset>
</charset-params>
次のように変更する必要があります。
<charset_params>
<input_charset>
<resource_path>/*</resource_path>
<java_charset_name>UTF-8</java_charset_name>
</input_charset>
</charset_params>
UTF-8
山かっこ内にないため変更されません。どうすればいいですか?
答え1
する
sed ': loop; s/\(<[^>]*\)-\([^>]*>\)/\1_\2/g; t loop'
、以外の文字(ゼロ以上)s/\(<[^>]*\)-\([^>]*>\)/\1_\2/g
、ハイフン()、以外の文字の束を探して最後に。前の部品とそれ以降の部品と交換されます。この演算子は一度に複数の置換を実行しますが、一度に1つだけ実行できます。例えば、<
>
-
>
>
-
_
-
g
<
>
<the-quick><brown-fox> <jumps-over> upside-down <the-lazy-dog>
に変更されます
<the_quick><brown_fox> <jumps_over> upside-down <the-lazy_dog>
ハイフンを含むすべての<
...単語のみが変更されますが、2つのハイフン()を含む単語は2番目の単語のみが変更されます。代替アイテムがある場合は、戻って他の代替アイテムを探すように指示します。>
<the-lazy-dog>
-
t loop
答え2
Perlを使うと簡単です。
perl -pe 's{<.*?>}{$& =~ y/-/_/r}ge' < your-file
または:
perl -i -pe 's{<.*?>}{$& =~ y/-/_/r}ge' your-file
i
複数の場所でファイルを編集します。
答え3
ファイルの例を使用してください。
<charset-params>
<input-charset>
<resource-path>/*</resource-path>
<java-charset-name>UTF-8</java-charset-name>
</input-charset>
</charset-params>
次のawkは、次のように操作を実行します。 「>」を処理するセクションの終わりとして解釈し、「<」をセクションの先頭として使用するため、セクション内では処理される内容は考慮されません。セクション内のすべての項目は、必要なgsub置換に対して処理され、配列部分に保存されます。その後、スクリプトは範囲外の区切り文字とコンテンツ処理を再開する必要があります。
awk ' {numrec=split($0,regs,">")
for (i=1; i<numrec; ++i){
split(regs[i],part,"<")
gsub("-","_",part[2])
res = sprintf("%s%s",res, part[1] "<" part[2] ">")}
print res
res=""}' entraunder
結果は次のとおりです。
<charset_params>
<input_charset>
<resource_path>/*</resource_path>
<java_charset_name>UTF-8</java_charset_name>
</input_charset>
</charset_params>
ファタイ
答え4
ツールキットの一部であるxq
コマンドラインXMLパーサーを使用します。yq
https://kislyuk.github.io/yq/(これはよく知られているJSONパーサーのラッパーですjq
。):
xq -x '
walk(
if type == "object" then
with_entries(.key |= gsub("-"; "_"))
else
.
end
)' file.xml
これは与えられたXMLファイルの全体構造を再帰的に巡回し、現在ものこのオブジェクト内のすべてのキーのすべてのダッシュを下線で置き換えるオブジェクト。
例:
$ cat file.xml
<charset-params>
<input-charset>
<resource-path>/*</resource-path>
<java-charset-name>UTF-8</java-charset-name>
</input-charset>
<something/>
</charset-params>
$ xq -x 'walk(if type == "object" then with_entries(.key|=gsub("-";"_")) else . end)' file.xml
<charset_params>
<input_charset>
<resource_path>/*</resource_path>
<java_charset_name>UTF-8</java_charset_name>
</input_charset>
<something></something>
</charset_params>
ツールは、またはオプションxq
を使用して内部編集を実行できます。-i
--in-place