【问题标题】:Add text when i replace string with sed command当我用 sed 命令替换字符串时添加文本
【发布时间】:2022-01-18 16:49:01
【问题描述】:

我做了一个脚本来检索源文件的内容,这样我就可以按照我想要的方式创建目标文件。

我执行了一个“sed”命令,以便将“Numérique”这个词更改为“PIC S”。

源文件.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

【问题讨论】:

  • 感谢您分享您的努力。你的问题不是 100% 清楚的。这些05 来自哪里?而这个PIC X(2)?请准确说明您要达到的目标,不要指望我们从您的尝试中猜测。
  • 05 来自我的变量 champAdd,我需要重新格式化我的源代码,以便我的目标可以像这样,对于 PIC X (2) 也是如此,正如你在我的源代码中看到的那样“ CHAR (2)" 但出于我个人的原因,我需要它是 PIC X。所以我的 sed 命令就在这里。我现在需要的是在我的 PIC S 更改后添加括号。我不想在我的目标中使用 PIC S 8.2,而是希望拥有 PIC S (8.2)
  • 好的,所以你的问题只是关于这个 Numérique 行?我建议编辑它并只保留这部分。
  • 是的,仅适用于“Numérique”行

标签: linux bash unix sed


【解决方案1】:
$ sed 's/;Numérique[[:space:]]\+\([^;]*\)/;PIC S(\1)/' <<< "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(\1)/' <<< "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(\1)/' 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\1/
          /Numérique/s/;Numérique\s+([^;]*)/;PIC S(\1)/' file.txt
MotifRad;PIC X(2);Motif de radiation
MtPrime;PIC S(8.2);Montant prime d'origine

【讨论】:

  • 我用你的替换了我的 sed "sed -i 's/Numérique/PIC S/' $fichier" 但它仍然给我相同的输出。
  • 我展示的所有内容都已在您使用 GNU sed 4.7 的确切示例上进行了测试。如果您没有看到与您自己的 sed 命令有任何区别,那么您所做的一定有问题。您是否修改到位(sed -i)?如果是,您的源文件已经被您自己的尝试修改过。恢复它。
  • 好的,我的编译有问题,工作正常。非常感谢
【解决方案2】:

我只是回答有关将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\1/' 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\1(\2)/' file
MotifRad;CHAR(2);Motif de radiation
MtPrime;PIC S (8.2);Montant prime d'origine

捕获组使用([thing to capture]) 定义,对该捕获项的引用是\1\2\n,最左边的左括号是最小的数字,依此类推。

例子:

echo 'this;that' | sed -E 's/(.*);(.*)/\2 \1/'
that this

【讨论】:

  • 我这样做了,但我的输出保持在 8.2 而不是 (8.2)
  • sed -E 's/Numérique([[:blank:]]+)([[:digit:].]+)/PIC S\1(\2)/' file 然后
  • 我的输出仍然没有任何内容
猜你喜欢
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 2013-12-13
  • 2021-10-28
  • 2016-10-30
  • 2023-03-27
相关资源
最近更新 更多