Remplacer une chaîne présente sur la première ligne du fichier UNIX

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