当我用 sed 命令替换字符串时添加文本
Add text when i replace string with sed command
我做了一个脚本来检索源文件的内容,所以我可以按照我想要的方式创建目标文件。
我执行了一个“sed”命令,所以我可以用“PIC S”更改单词“Numérique”。
源文件.txt:
MotifRad;CHAR(2);Motif de radiation
MtPrime;Numérique 8.2;Montant prime d'origine
目标文件.txt:
* Motif de radiation
05 MotifRad PIC X(2).
* Montant prime d'origine
05 MtPrime PIC S 8.2.
如您所见,我确实更改了“Numérique”一词,但我想像这样在括号中添加数字:PIC S (8.2),我该怎么做?
Bash 脚本:
#!/bin/bash
#Fichier Source
fichier="APGFPOLI.des.txt"
champAdd="05 "
if [[ -f "$fichier" ]]
then
# read it
sed 1d $fichier| sed -i 's/CHAR/PIC X/' $fichier | sed -i 's/Numérique/PIC S/' $fichier | while IFS=';' read -r nomChamp format libelle
do
echo \* $libelle
echo $champAdd $nomChamp $format.
done <"$fichier" > test.txt
fi
我只回答有关将 Numérique [a floating point number]
替换为 PIC S [that same floating point number]
的部分。
使用捕获组捕获浮点数并使用反向引用将其添加回替换:
cat file
MotifRad;CHAR(2);Motif de radiation
MtPrime;Numérique 8.2;Montant prime d'origine
sed -E 's/Numérique([[:blank:]]+[[:digit:].]+)/PIC S/' file
MotifRad;CHAR(2);Motif de radiation
MtPrime;PIC S 8.2;Montant prime d'origine
如果你想在替换前后加上括号:
sed -E 's/Numérique([[:blank:]]+)([[:digit:].]+)/PIC S()/' file
MotifRad;CHAR(2);Motif de radiation
MtPrime;PIC S (8.2);Montant prime d'origine
捕获组用 ([thing to capture])
定义,对捕获项的引用是 </code>、<code>
、\n
,最左边的左括号是最小的数字等等。
示例:
echo 'this;that' | sed -E 's/(.*);(.*)/ /'
that this
$ sed 's/;Numérique[[:space:]]\+\([^;]*\)/;PIC S()/' <<< "MtPrime;Numérique 8.2;Montant prime d'origine"
MtPrime;PIC S(8.2);Montant prime d'origine
或者,使用 GNU sed:
$ sed -E 's/;Numérique\s+([^;]*)/;PIC S()/' <<< "MtPrime;Numérique 8.2;Montant prime d'origine"
MtPrime;PIC S(8.2);Montant prime d'origine
已应用于您的文件:
$ sed -E '/Numérique/s/;Numérique\s+([^;]*)/;PIC S()/' file.txt
MotifRad;CHAR(2);Motif de radiation
MtPrime;PIC S(8.2);Montant prime d'origine
如果要在同一个 运行 中替换 CHAR
和 Numérique
:
$ sed -E '/CHAR/s/;CHAR(\([[:digit:]]+\));/;PIC X/
/Numérique/s/;Numérique\s+([^;]*)/;PIC S()/' file.txt
MotifRad;PIC X(2);Motif de radiation
MtPrime;PIC S(8.2);Montant prime d'origine
我做了一个脚本来检索源文件的内容,所以我可以按照我想要的方式创建目标文件。
我执行了一个“sed”命令,所以我可以用“PIC S”更改单词“Numérique”。
源文件.txt:
MotifRad;CHAR(2);Motif de radiation
MtPrime;Numérique 8.2;Montant prime d'origine
目标文件.txt:
* Motif de radiation
05 MotifRad PIC X(2).
* Montant prime d'origine
05 MtPrime PIC S 8.2.
如您所见,我确实更改了“Numérique”一词,但我想像这样在括号中添加数字:PIC S (8.2),我该怎么做?
Bash 脚本:
#!/bin/bash
#Fichier Source
fichier="APGFPOLI.des.txt"
champAdd="05 "
if [[ -f "$fichier" ]]
then
# read it
sed 1d $fichier| sed -i 's/CHAR/PIC X/' $fichier | sed -i 's/Numérique/PIC S/' $fichier | while IFS=';' read -r nomChamp format libelle
do
echo \* $libelle
echo $champAdd $nomChamp $format.
done <"$fichier" > test.txt
fi
我只回答有关将 Numérique [a floating point number]
替换为 PIC S [that same floating point number]
的部分。
使用捕获组捕获浮点数并使用反向引用将其添加回替换:
cat file
MotifRad;CHAR(2);Motif de radiation
MtPrime;Numérique 8.2;Montant prime d'origine
sed -E 's/Numérique([[:blank:]]+[[:digit:].]+)/PIC S/' file
MotifRad;CHAR(2);Motif de radiation
MtPrime;PIC S 8.2;Montant prime d'origine
如果你想在替换前后加上括号:
sed -E 's/Numérique([[:blank:]]+)([[:digit:].]+)/PIC S()/' file
MotifRad;CHAR(2);Motif de radiation
MtPrime;PIC S (8.2);Montant prime d'origine
捕获组用 ([thing to capture])
定义,对捕获项的引用是 </code>、<code>
、\n
,最左边的左括号是最小的数字等等。
示例:
echo 'this;that' | sed -E 's/(.*);(.*)/ /'
that this
$ sed 's/;Numérique[[:space:]]\+\([^;]*\)/;PIC S()/' <<< "MtPrime;Numérique 8.2;Montant prime d'origine"
MtPrime;PIC S(8.2);Montant prime d'origine
或者,使用 GNU sed:
$ sed -E 's/;Numérique\s+([^;]*)/;PIC S()/' <<< "MtPrime;Numérique 8.2;Montant prime d'origine"
MtPrime;PIC S(8.2);Montant prime d'origine
已应用于您的文件:
$ sed -E '/Numérique/s/;Numérique\s+([^;]*)/;PIC S()/' file.txt
MotifRad;CHAR(2);Motif de radiation
MtPrime;PIC S(8.2);Montant prime d'origine
如果要在同一个 运行 中替换 CHAR
和 Numérique
:
$ sed -E '/CHAR/s/;CHAR(\([[:digit:]]+\));/;PIC X/
/Numérique/s/;Numérique\s+([^;]*)/;PIC S()/' file.txt
MotifRad;PIC X(2);Motif de radiation
MtPrime;PIC S(8.2);Montant prime d'origine