文字列のすべての文字を置換規則に従って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
答え2
sedを使用してください:
文字列の2文字を1つずつ変更するには、
sed -i 's/A/Y/;s/B/V/' file
変更して別のファイルに保存するには:
sed 's/A/Y/' file > file1; sed 's/B/V/' file > file1
答え3
次の方法で行われており、うまく機能します。
awk '{gsub("A","Y",$0);print $0}' l.txt > f_1.txt
awk '{gsub("B","V",$0);print $0}' l.txt > f_2.txt
awk '{gsub("C","Q",$0);print $0}' l.txt > f_3.txt
答え4
エラーを防ぐために、ユーザー入力に基づいてスクリプトを作成しました。
#!/bin/bash
echo "enter the character need to display"
read old
echo "enter the need character to be replaced"
read new
sed "s/$old/$new/g" r.txt>file_$old.txt
First it will ask for old content which need to be replaced.
Second it will ask for new content which needs to be replaced with old content
THird it saves the file after each iteration
Based on how characters need to be replaced you can add above mentioned script in for loop