Post Image

Aumenta la Tua Produttività: Inserire Testo all'Inizio o alla Fine di una Riga con Vim e sed su Linux, Windows e Mac

Modificare file di testo è una delle operazioni più comuni per programmatori e amministratori di sistema. Vim è un editor di testo molto potente utilizzato principalmente su sistemi Unix e Linux, mentre sed è un comando molto utile per eseguire modifiche di testo in modo non interattivo.

In questo articolo, vedremo come utilizzare Vim e sed per inserire un carattere o una parola, all'inizio o alla fine delle righe di un file. In particolare, vedrai come inserire un carattere o parola sia all'inizio che alla fine di tutte le righe del file, o di una sola porzione di esse.

Gli esempi mostrati possono essere eseguiti sia su ambiente Linux, sia su Windows che su Mac poiché utilizzeremo un container Docker per l'esecuzione.

Preparazione dell'ambiente con Docker

La prima attività da fare, propedeutica all'esecuzione dei comandi, è creare l'ambiente Docker.

Iniziamo con il creare un Dockerfile, come segue:

# Utilizza l'immagine base di Ubuntu
FROM debian:stable-slim

# Esegui l'aggiornamento dei pacchetti e installa Vim e sed
RUN apt-get update && apt-get install -y vim sed

# Imposta la directory di lavoro
WORKDIR /mnt/data

Nel file è utilizzata l'immagine debian:stable-slim sulla quale sono installati i pacchetti vim e sed.

Successivamente andiamo a creare il docker-compose.yml, come segue:

services:
  vim-sed:
    build: .
    container_name: vim_sed_container
    volumes:
      - ./work_folder:/mnt/data
    command: tail -f /dev/null

nel docker-compose.yml è presente un volume che monta la cartella work_folder sulla /mnt/data del container. Assicurati di avere una cartella sulla quale stai implementando, come segue:

cartella_progetto
|- Dockerfile
|- docker-compose.yml
|- work_folder
    |- input.csv
    |- ...

Nella cartella work_folder metterai i file sui quali applicare le modifiche testuali.

Infine, possiamo avviare il container con il comando:

docker-compose up --build -d

questo comando esegue in background il container.

Per eseguire i comandi, sia vim che sed, descritti successivamente, accedere al container docker con il comando:

docker-compose exec -it vim-sed /bin/bash

a questo punto sarai sulla shell del container e da li puoi eseguire i comandi che ora ti descrivo.

Gestione modifiche con Vim

Inserire un Carattere o Parola all'Inizio di Tutte le Righe del File

Supponi di voler inserire la parola BEGIN: all'inizio di ogni riga del file input.csv presente all'interno della work_folder. Segui i seguenti passi per eseguire la modifica al file.

1. Apri il file con Vim

Per prima cosa apri il file con Vim, come segue:

vim input.csv
2. Abilita la modalità comando

All'interno di Vim, abilita la modalità comando premendo Esc.

3. Esegui comando per inserire BEGIN: all'inizio della riga

Per inserire BEGIN all'inizio di ogni riga, digita il seguente comando:

:%s/^/BEGIN:/
  • %: indica che il comando si applica a tutte le righe del file
  • ^: rappresenta l'inizio della riga

A seguito dell'esecuzione del comando vedrai la parola BEGIN: comparire su ogni riga del tuo file. A questo punto, se vorrai, puoi salvare le modifiche con il comando :w.

Applicare la Modifica a un intervallo di righe del File

Supponi di voler inserire la parola BEGIN: all'inizio di alcune righe selezionate (quindi non di tutte quelle presenti sul file). Segui i passi per fare ciò.

1. Apri il file con Vim

Per prima cosa apri il file con Vim, come segue:

vim input.csv
2. Abilita la modalità comando

All'interno di Vim, abilita la modalità comando premendo Esc.

3. Imposta marcatore iniziale

Posiziona il cursore sulla prima riga che vuoi modificare ed imposta un marcatore con il comando ma (dove a è il nome del marcatore che puoi scegliere a tuo piacimento).

4. Imposta marcatore finale

Posiziona il cursore sull'ultima riga dell'intervallo che vuoi modificare ed imposta un marcatore con il comando mb.

5. Esegui comando per inserire BEGIN: all'inizio della riga

A questo punto hai due marcatori a e b. Utilizza il seguente comando per rinominare le sole righe contenuti nell'intervallo delimitato dai marcatori.

:'a,'bs/^/BEGIN:/
  • 'a,'b: definisce l'intervallo di righe da considerare
  • ^: rappresenta l'inizio della riga

Applicare la Modifica a Diverse Porzioni del File

Per modificare più intervalli di righe con Vim, ripeti il procedimento descritto nel precedente paragrafo, su ogni intervallo che vorrai modificare. Puoi utilizza o marcatori diversi per ogni coppia di marcatori e poi eseguire i comandi modificando i marcatori oppure utilizzare sempre la stessa coppia di marcatori, richiamando sempre lo stesso comando.

Inserire un Carattere o Parola alla Fine di Tutte le Righe del File

Supponi di voler inserire :END alla fine di ogni riga del tuo file. I comandi da eseguire sono i medesimi di quelli presentati per l'inserimento di BEGIN: all'inizio della riga, con la sola modifica di sostituire il carattere ^ con il carattere $, nei comandi di sostituzione.

Quindi, ad esempio, il comando :%s/^/BEGIN:/ diventa :%s/$/:END/.

Gestione modifiche con sed

Puoi eseguire le medesime modifiche utilizzando il comando sed.

Inserire un Carattere o Parola all'Inizio di Tutte le Righe del File

Per inserire la parola BEGIN: all'inizio di tutte le righe del file input.csv, esegui il comando:

sed -i 's/^/BEGIN:/' input.csv
  • -i: consente di modificare il file
  • s/^/BEGIN:/ sostituisce il carattere di inizio riga ^ con BEGIN:

Inserire un Carattere o Parola alla Fine di Tutte le Righe del File

Per inserire un carattere o parola alla fine del file, il comando è il medesimo con la sostituzione di ^ con $.

sed -i 's/$/:END/' input.csv
  • -i: consente di modificare il file
  • s/$/:END/ sostituisce il carattere di fine riga $ con :END

Applicare la Modifica a una Porzione del File

Puoi specificare un intervallo di linee sulle quali applicare la modifica. Per applicare, ad esempio, la modifica dalla riga 7 alla riga 15, esegui:

sed -i '7,15s/^/TESTO_DA_INSERIRE/' input.csv
  • 7,15 indica l'intervallo di righe sulle quali inserire la modifica

Applicare la Modifica a Diverse Porzioni del File

Puoi applicare la modifica a diversi intervalli di righe sul file, con il seguente comando:

sed -i -e '2,8s/^/INIZIO___/' -e '15,20s/$/___FINE/' input.csv
  • -e opzione che consente di concatenare più comandi

Conclusioni

Sia Vim che sed offrono potenti strumenti per modificare file di testo. La scelta tra i due dipende dalle tue necessità: Vim è ideale per modifiche interattive e sed per operazioni scriptabili e automatizzate. Con l'aiuto di Docker, anche gli utenti Windows e Mac possono facilmente accedere a questi strumenti e modificare file di testo in un ambiente Linux.