文字列の文字を1つずつ変更するには?

文字列の文字を1つずつ変更するには?

文字列のすべての文字を置換規則に従って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

おすすめ記事