Biz birini kullanabilir sedveya awktamamen sorunu çözmek için.
İle sed:
$ sed 's/^.\./0&/' file.txt
Tüm &ikame komutu (yerine kısmında oluşur s), bu komutun model kısmına denk giriş hattının bir kısmına genişletilecektir.
Normal ifade ^.\., " ( ^) ile başlayan rastgele bir karakter ( .) ve ardından değişmez nokta ( \.) ile başlayan tüm satırları eşleştir " anlamına gelir .
Çizgi, 1.02.2017 23:40:00desen eşleşir ve çizginin başlangıcında 1.değiştirilir 01..
İle awk:
Söz konusu kısmi awkkod üzerine inşa ...
Bu, belirtildiği gibi, her girdi satırının ikinci karakterini yazdırır:
$ awk '{ print substr($0, 2, 1) }' file.txt
substr($0, 2, 1)İkinci karakteri döndüren gerçeği kullanabilir ve bunu koşul olarak kullanabiliriz:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
Ne gider { ... }prepends o kodu $0bir sıfır ile mevcut hattın içeriği ise, önceki koşul doğruysa:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
O zaman sadece tüm çizgilerin yazdırıldığından emin olmalıyız:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
Koşul substr($0, 2, 1) == "."elbette düzenli bir ifadeye de dönüştürülebilir ( sedçözümde kullandığımız ifadenin aynısını kullanırız ):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
"Her zaman daha kısa olanın daha iyi" olduğunu düşünen bazı insanlar bunu şöyle yazar:
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(ve muhtemelen aynı zamanda en boşlukları kaldırın: awk '/^.\./{$0="0"$0}1' file.txt)