当我用 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

如果要在同一个 运行 中替换 CHARNumé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