文字列のすべての文字を置換規則に従って1つずつ変更し、Linuxでファイルに保存したいと思います。
代替ファイル(sub.txt)。
A -> Y
B -> V
C -> Q
...
入力ファイル:
ABCDEFGHIJ
まず(A〜Y)YBCDEFGHIJ
- >ファイルを保存
第二に、(B to V)AVCDEFGHIJ
- >ファイルを保存
どのようなアプローチを取るべきですか?
ベストアンサー1
これを提供しますsub.txt
:
$ cat sub.txt
A -> Y
B -> V
C -> Q
D -> K
E -> L
F -> O
G -> P
H -> W
I -> X
J -> Z
シェルループで繰り返して、各行の3つの要素を変数として読み取ることができます。
while IFS=' ' read -r from ignore to; do ... ; done < sub.txt
このwhile
ループでは、$from
ソース文字で$to
置き換えたい文字です。真ん中にあるのは$ignore
ただのブラケットです->
。
これは、翻訳する文字のリストにスペースと改行文字(' '
および)が含まれていないと仮定します。\n
これを念頭に置いて、tr
次のように変更して出力を新しいファイルにリダイレクトできます。
while IFS=' ' read -r from discard to; do
printf '%s\n' "$string" | tr "$from" "$to" > changed."$from".txt
done < sub.txt
tr
マルチバイト文字の場合、一部の実装は失敗します。上記の内容もそうでないと仮定します。$from
$to
[
$from
/
場合、string="ABCDEFGHIJ"
上記のコマンドは次のファイルを生成します。
$ ls changed*
changed.A.txt changed.D.txt changed.G.txt changed.J.txt
changed.B.txt changed.E.txt changed.H.txt
changed.C.txt changed.F.txt changed.I.txt
次のコンテンツが含まれています。
$ for f in changed.*; do printf '%s\n' "=== $f ==="; cat "$f"; done
=== changed.A.txt ===
YBCDEFGHIJ
=== changed.B.txt ===
AVCDEFGHIJ
=== changed.C.txt ===
ABQDEFGHIJ
=== changed.D.txt ===
ABCKEFGHIJ
=== changed.E.txt ===
ABCDLFGHIJ
=== changed.F.txt ===
ABCDEOGHIJ
=== changed.G.txt ===
ABCDEFPHIJ
=== changed.H.txt ===
ABCDEFGWIJ
=== changed.I.txt ===
ABCDEFGHXJ
=== changed.J.txt ===
ABCDEFGHIZ
これにより、各文字が個別に変更されます。これを段階的に実行することで、最初のファイルは最初の文字のみを変更し、2番目のファイルは最初の文字と2番目の文字の両方を変更したい場合は次のことができます。
tmpFile=$(mktemp)
printf '%s\n' "$string" > "$tmpFile"
while IFS=' ' read -r from ignore to; do
tr "$from" "$to" < "$tmpFile" > changed."$from".txt
cp changed."$from".txt "$tmpFile"
done < sub.txt
これにより、次のファイルが生成されます。
$ for f in changed.*; do printf '%s\n' "=== $f ==="; cat "$f"; done
=== changed.A.txt ===
YBCDEFGHIJ
=== changed.B.txt ===
YVCDEFGHIJ
=== changed.C.txt ===
YVQDEFGHIJ
=== changed.D.txt ===
YVQKEFGHIJ
=== changed.E.txt ===
YVQKLFGHIJ
=== changed.F.txt ===
YVQKLOGHIJ
=== changed.G.txt ===
YVQKLOPHIJ
=== changed.H.txt ===
YVQKLOPWIJ
=== changed.I.txt ===
YVQKLOPWXJ
=== changed.J.txt ===
YVQKLOPWXZ