仅更改 bash 脚本中第一行的输出
Change output of only the first line in bash script
这是我的来源:
TABLE;APGFPOLI;
这是我想要的输出:
01 APGFPOLI.
所以我想做的是删除“TABLE”并在“APGFPOLI”之前添加 01。我只需要为第一行做。所以我尝试这样做:
#!/bin/bash
#Fichier Source
fichier="APGFPOLI.des.txt"
champAdd="05 "
if [[ -f "$fichier" ]]
then
# read it
sed -i '1 s/TABLE//' $fichier |sed -i 's/CHAR/PIC X/' $fichier | sed -E '/Numérique/s/;Numérique\s+([^;]*)/;PIC 9()/' $fichier | while IFS=';' read -r nomChamp format libelle
do
echo \* $libelle
echo $champAdd $nomChamp $format.
done > test.txt
fi
如您所见,我的第一个 sed 应该删除 TABLE 但它不起作用。我也为我的其他行做了回显,但我也想回显这个特定的第一行。
这是我的 bash 给我的输出:
*
05 TABLE APGFPOLI.
如果有帮助,这是我的完整资源:
TABLE;APGFPOLI;
Contrat;CHAR(16);Numéro du contrat
Libelle;CHAR(30);Libellé du contrat
DtCreation;CHAR(8);Date de création
DtMaj;CHAR(8);Date de dernière MAJ
DtEffet;CHAR(8);Date d'effet adhésion
MotifAdh;CHAR(2);Motif d'adhésion
DtRadiation;CHAR(8);Date de radiation
DtEnrRad;CHAR(8);Date enregistrement radiat
MotifRad;CHAR(2);Motif de radiation
MtPrime;Numérique 8.2;Montant prime d'origine
DtEffetSusp;CHAR(8);Date d'effet de suspension
DtFinSusp;CHAR(8);Date de fin de suspension
MotifSusp;CHAR(2);Motif de suspension
DestBord;CHAR(1);Destinataire du bordereau
CdDest;CHAR(5);Code du destinataire
NivRupBord;CHAR(1);Niveau rupture bordereau
BordCETIP;CHAR(1);Bordereau CTIP
EnvBordNom;CHAR(1);Envoi bordereau nominatif
Indice;CHAR(2);Indice appliqué
Echeance;CHAR(2);Echéance de l'indice (MM)
Effectif;CHAR(5);Effectif
CdRegr;CHAR(3);Code regroupement 1
CdGroupe;CHAR(3);Code regroupement 2
Periodicite;CHAR(1);Périodicité
Terme;CHAR(1);Terme
Produit;CHAR(6);Code produit affecté
Inspecteur;CHAR(5);Inspecteur
CleInsp;CHAR(1);Clé inspecteur
Filler;CHAR(6);Filler
您通常不希望对同一文件多次 运行 sed -i
。
您的整个任务可以改写为
sed -i '1s/TABLE/01 /' APGFPOLI.des.txt
如果替换字符串应来自 shell 变量,则需要使用双引号而不是单引号:
replacement="05"
sed -i "1s/TABLE/$replacement /" APGFPOLI.des.txt
如果您想保留其他任务(问题中未记录),您可以轻松地将它们合并到同一个脚本中。请记住,sed
是一种脚本语言;您可以输入任意复杂的脚本(有些疯狂的人甚至在 sed
脚本中实现了桌面计算器和生命游戏)。
sed -i -E -e '1 s/TABLE/01 /' -e 's/CHAR/PIC X/' \
-e '/Numérique/s/;Numérique\s+([^;]*)/;PIC 9()/' APGFPOLI.des.txt
如果在此之后你想拉出结果并用一些装饰来显示它,我会添加第二个 sed
没有 -i
的脚本,这样它就可以在标准输出上显示输出而无需修改文件。
sed '1s/\([^;]*\);\([^;]*\);\([^;]*\);.*/* \n05 /;q' APGFPOLI.des.txt
要从第一行删除 TABLE;
并在前面添加 01
,您只需要做:
fichier="APGFPOLI.des.txt"
sed -i '1s/^TABLE;/01 /' "$fichier"
当你在 SO 中提问时,建议删除与你的问题无关的部分代码,如命令 sed -i 's/CHAR/PIC X/' $fichier
等。
这是我的来源:
TABLE;APGFPOLI;
这是我想要的输出:
01 APGFPOLI.
所以我想做的是删除“TABLE”并在“APGFPOLI”之前添加 01。我只需要为第一行做。所以我尝试这样做:
#!/bin/bash
#Fichier Source
fichier="APGFPOLI.des.txt"
champAdd="05 "
if [[ -f "$fichier" ]]
then
# read it
sed -i '1 s/TABLE//' $fichier |sed -i 's/CHAR/PIC X/' $fichier | sed -E '/Numérique/s/;Numérique\s+([^;]*)/;PIC 9()/' $fichier | while IFS=';' read -r nomChamp format libelle
do
echo \* $libelle
echo $champAdd $nomChamp $format.
done > test.txt
fi
如您所见,我的第一个 sed 应该删除 TABLE 但它不起作用。我也为我的其他行做了回显,但我也想回显这个特定的第一行。
这是我的 bash 给我的输出:
*
05 TABLE APGFPOLI.
如果有帮助,这是我的完整资源:
TABLE;APGFPOLI;
Contrat;CHAR(16);Numéro du contrat
Libelle;CHAR(30);Libellé du contrat
DtCreation;CHAR(8);Date de création
DtMaj;CHAR(8);Date de dernière MAJ
DtEffet;CHAR(8);Date d'effet adhésion
MotifAdh;CHAR(2);Motif d'adhésion
DtRadiation;CHAR(8);Date de radiation
DtEnrRad;CHAR(8);Date enregistrement radiat
MotifRad;CHAR(2);Motif de radiation
MtPrime;Numérique 8.2;Montant prime d'origine
DtEffetSusp;CHAR(8);Date d'effet de suspension
DtFinSusp;CHAR(8);Date de fin de suspension
MotifSusp;CHAR(2);Motif de suspension
DestBord;CHAR(1);Destinataire du bordereau
CdDest;CHAR(5);Code du destinataire
NivRupBord;CHAR(1);Niveau rupture bordereau
BordCETIP;CHAR(1);Bordereau CTIP
EnvBordNom;CHAR(1);Envoi bordereau nominatif
Indice;CHAR(2);Indice appliqué
Echeance;CHAR(2);Echéance de l'indice (MM)
Effectif;CHAR(5);Effectif
CdRegr;CHAR(3);Code regroupement 1
CdGroupe;CHAR(3);Code regroupement 2
Periodicite;CHAR(1);Périodicité
Terme;CHAR(1);Terme
Produit;CHAR(6);Code produit affecté
Inspecteur;CHAR(5);Inspecteur
CleInsp;CHAR(1);Clé inspecteur
Filler;CHAR(6);Filler
您通常不希望对同一文件多次 运行 sed -i
。
您的整个任务可以改写为
sed -i '1s/TABLE/01 /' APGFPOLI.des.txt
如果替换字符串应来自 shell 变量,则需要使用双引号而不是单引号:
replacement="05"
sed -i "1s/TABLE/$replacement /" APGFPOLI.des.txt
如果您想保留其他任务(问题中未记录),您可以轻松地将它们合并到同一个脚本中。请记住,sed
是一种脚本语言;您可以输入任意复杂的脚本(有些疯狂的人甚至在 sed
脚本中实现了桌面计算器和生命游戏)。
sed -i -E -e '1 s/TABLE/01 /' -e 's/CHAR/PIC X/' \
-e '/Numérique/s/;Numérique\s+([^;]*)/;PIC 9()/' APGFPOLI.des.txt
如果在此之后你想拉出结果并用一些装饰来显示它,我会添加第二个 sed
没有 -i
的脚本,这样它就可以在标准输出上显示输出而无需修改文件。
sed '1s/\([^;]*\);\([^;]*\);\([^;]*\);.*/* \n05 /;q' APGFPOLI.des.txt
要从第一行删除 TABLE;
并在前面添加 01
,您只需要做:
fichier="APGFPOLI.des.txt"
sed -i '1s/^TABLE;/01 /' "$fichier"
当你在 SO 中提问时,建议删除与你的问题无关的部分代码,如命令 sed -i 's/CHAR/PIC X/' $fichier
等。