Je voudrais remplacer une chaîne qui est présente sur la première ligne, même si elle est présente sur les autres lignes du fichier. Comment puis-je le faire via un script shell? Est-ce que quelqu’un peut m’aider à ce sujet? Mon code est comme ci-dessous. J’extrais la première ligne du fichier et après je ne suis pas sûr de savoir comment faire un remplacement. Toute aide serait appréciée. Merci.
Les gars -Je voudrais remplacer une chaîne présente dans $ line et écrire la nouvelle ligne dans le même fichier au même endroit.
Code:
while read line do if [[ $v_counter == 0 ]] then echo "$line" v_counter=$(($v_counter + 1)); fi done < "$v_Full_File_Nm"
Données d’échantillon:
Consortingbution
BUXT_CMPID|MEDICAL_RECORD_NUM|FACILITY_ID|PATIENT_LAST_NAME|PATIENT_FIRST_NAME|HOME_ADDRESS_LINE_1|HOME_ADDRESS_LINE_2|HOME_CITY|HOME_STATE|HOME_ZIP|MOSAIC_CODE|MOSAIC_DESC|DRIVE_TIME| buxt_pt_apnd_20140624_head_5records.txt 100106086|5000120878|7141|HARRIS|NEDRA|6246 PARALLEL PKWY||KANSAS CITY|KS|66102|S71|Tough Times|2|buxt_pt_apnd_20140624_head_5records.txt
Sortie
BUXT_CMPID|MEDICAL_RECORD_NUM|FACILITY_ID|PATIENT_LAST_NAME|PATIENT_FIRST_NAME|HOME_ADDRESS_LINE_1|HOME_ADDRESS_LINE_2|HOME_CITY|HOME_STATE|HOME_ZIP|MOSAIC_CODE|MOSAIC_DESC|DRIVE_TIME| SRC_FILE_NM 100106086|5000120878|7141|HARRIS|NEDRA|6246 PARALLEL PKWY||KANSAS CITY|KS|66102|S71|Tough Times|2|buxt_pt_apnd_20140624_head_5records.txt
À partir des exemples de données ci-dessus, je dois remplacer buxt_pt_apnd_20140624_head_5records.txt par la chaîne SRC_FILE_NAME .
Pourquoi ne pas utiliser sed
?
sed -e '1s/fred/frog/' yourfile
remplacera fred
par la frog
sur la ligne 1.
Si votre chaîne est une variable, vous pouvez le faire pour que la variable soit développée:
sed -e "1s/$varA/$varB/" yourfile
Si vous voulez le faire en place et changer votre fichier, ajoutez -i
avant -e
.
awk -v old="ssortingng1" -v new="ssortingng2" ' NR==1 && (idx=index($0,old)) { $0 = substr($0,1,idx-1) new substr($0,idx+length(old)) } 1' file > /usr/tmp/tmp$$ && mv /usr/tmp/tmp$$ file
Ce qui précède remplacera ssortingng1
par ssortingng2
uniquement lorsqu’il apparaît dans la première ligne du file
.
Toute solution publiée qui utilise awk mais n’utilise pas d’ index
ne fonctionnera pas en général. Idem pour toute solution publiée utilisant sed. La raison en est que ceux-ci fonctionneraient sur les RE, pas sur les chaînes, et se comporteraient donc de manière indésirable pour le remplacement des chaînes en fonction des caractères présents dans ssortingng1
.
On dirait que les OP vont avec une solution sed-remplacement donc c’est juste pour quiconque cherchant à remplacer une chaîne: Voici à quoi ressemblerait une fonction de remplacement de chaîne si vous préférez ne pas l’avoir en ligne:
awk -v old="ssortingng1" -v new="ssortingng2" ' function strsub(old,new,tgt, idx) { if ( idx = index(tgt,old) ) { tgt = substr(tgt,1,idx-1) new substr(tgt,idx+length(old)) } return tgt } NR==1 { $0 = strsub(old,new,$0) } 1' file
Une solution bash:
file="afile.txt" str="hello" repl="goodbye" IFS= read -r line < "$file" line=${line/$str/$repl} tmpfile="/usr/tmp/$file.$$.tmp" { echo "$line" tail -n+2 "$file" } > "$tmpfile" && mv "$tmpfile" "$file"
Notez que $str
ci-dessus sera interprété comme un “pattern” (un type simple de regex) où *
correspond à n’importe quel nombre de caractères ?
correspond à n’importe quel caractère, [abc]
correspond à l’un des caractères entre crochets et [^abc]
(ou [!abc]
) correspond à n’importe quel caractère qui n’est pas entre crochets. Voir la correspondance de motif