inserează un caracter la începutul liniei specificate în fișier (Unix, Procesare Text)

user210015 a intrebat.

Am nevoie să inserez caracterul (#) la începutul liniei specificate într-un fișier text.

Exemplu de intrare:

Hellow1
Hellow2
Hellow3

Ieșire dorită

Hellow1
#Hellow2
Hellow3

Comentarii

  • Cum ar trebui să găsim „linia specificată” ? Este după numărul liniei ? Este după un text specific ? Este după un anumit model de căutare? Vă rugăm să vă clarificați întrebarea –  > Por Sergiy Kolodyazhnyy.
6 răspunsuri
Kusalananda

Pentru a insera un # pe linia cu cuvântul Hellow2, , puteți folosi sed în felul următor:

sed '/^Hellow2/ s/./#&/' input.txt >output.txt

Pentru a introduce un # la începutul celei de-a doua linii a unui text, puteți folosi sed în felul următor:

sed '2 s/./#&/' input.txt >output.txt

La & va fi înlocuit cu ceea ce a fost potrivit cu modelul.

Eu evit să folosesc sed -i (editare pe loc), deoarece nu știu ce înseamnă sed folosiți și majoritatea implementărilor de sed utilizează moduri incompatibile de gestionare a acestui indicator (a se vedea Cum pot obține portabilitatea cu sed -i (in-place editing)?).

În schimb, efectuați substituția ca mai sus și apoi

mv output.txt input.txt

dacă doriți să înlocuiți datele originale cu rezultatul. Acest lucru vă oferă, de asemenea, o șansă de a vă asigura că a ieșit corect.

Lucru echivalent cu awk:

awk '/^Hellow2/ { $0 = "#" $0 }; 1' input.txt >output.txt

awk 'NR == 2 { $0 = "#" $0 }; 1' input.txt >output.txt

Brian C

Întrebarea dumneavoastră este neclară. Presupunând că doriți să comentați textul specific:

sed -i.bak 's/^(Hellow2)$/#1/'

Acest lucru va face o înlocuire pe loc a tuturor liniilor care se potrivesc exact cu șirul de caractere „Hellow2” și le va înlocui cu un # urmat de linia care s-a potrivit.

Comentarii

  • Funcționează și se salvează în fișier – Mulțumesc mult! –  > Por user21001515.
  • g modificatorul nu este necesar. Orice model care este ancorat cu ^ (sau $) nu se poate potrivi decât o singură dată. –  > Por Kusalananda.
  • @Kusalananda: Mulțumesc, am rezolvat acest lucru. Bună observație. –  > Por Brian C.
William Pursell

Modelul general pentru a aplica un s la anumite linii este [2addr]s... Unde 2addr reprezintă 0, 1 sau 2 adrese. Cu alte cuvinte, dacă doriți să inserați un # înaintea liniilor care se potrivesc unui model:

sed -e '/pattern/s/^/#/'

Dacă doriți să efectuați înlocuirea pe linia $n:

sed -e "${n}s/^/#/"  # (This requires that $n be a well formatted number)

Dacă doriți să se potrivească intervalul de linii $n până la $m:

sed -e "${n},${m}s/^/#/"  # $n and $m must be well formed numbers.  eg '2'

Dacă doriți să potriviți toate liniile dintre o linie care se potrivește cu pattern1 și o linie care se potrivește cu `pattern2:

sed -e '/pattern1/,/pattern2/s/^/#/' 

Wissam Roujoulah

Puteți face acest lucru cu awk:

awk '{if ($0 == "Hellow2") print "#"$0; else print $0}' yourfile > outputfile

Comentarii

  • Acest lucru poate fi prescurtat cu awk '$0=="Hellow2"{print "#"$0;next};1' input.txt. Modelul înainte de fiecare bloc de cod {} poate fi tratat ca if declarație deja. 1 Doar îi spune lui awk să tipărească linia, atâta tot –  > Por Sergiy Kolodyazhnyy.
  • @Serg Mulțumesc pentru informații, aveți perfectă dreptate, dar, am vrut să fie clar –  > Por Wissam Roujoulah.
  • dar nu o salvează în fișier… cum pot să o salvez? –  > Por user21001515.
  • @user210015 Mi-am editat răspunsul –  > Por Wissam Roujoulah.
JonnieJS

Dacă doriți să inserați înainte de linii 2 la 4 puteți specifica intervalul.

sed -i -e '2,4s/^/# /' test.txt

Dacă doriți linii specifice, nu intervalul, ar trebui să fie în expresii diferite. (de exemplu, liniile 2 și 4, dar nu și 3.)

sed -i -e '2s/^/# /' -e '4s/^/# /' test.txt

raghvendra gupta
sed -i 's/string/#&' file

șirul trebuie introdus de la început

utilizator339704

Comentarii

  • Bine ați venit pe site. Vă rugăm să indicați în ce fel răspunsul dvs. este diferit de cel al lui @Brian C sau de cel al lui @Kusalananda. –  > Por AdminBee.