замініть n-е виникнення рядка в кожному рядку текстового файлу


15

У мене великі текстові файли з рядками з обмеженим пробілом (2-5). Рядки можуть містити "" "або" - ". Я хотів би замінити, скажімо, другий пробіл на трубу.

Який найкращий шлях?

Використовуючи sed, я думав про це:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

Будь-які інші / кращі / простіші ідеї?

Відповіді:


22

Ви можете додати число в кінці команди заміну. Наприклад, нижче буде замінено другий вигляд oldрядка newу кожному рядку file:

sed 's/old/new/2' file

Тож замість запропонованого рішення ви можете використовувати:

sed 's/ /|/2'

Для отримання додаткової інформації дивіться, наприклад, цей підручник з седу .


2
З sedінформаційного файлу: "Примітка. Стандарт POSIX не визначає, що має відбуватися при змішуванні реалізацій g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across sed. Для GNU` sed "взаємодія визначається так: ігноруйте відповідність до NUMBERth, а потім співставляйте та замінюйте всі сірники від NUMBERth on. "
Призупинено до подальшого повідомлення.

Інформаційні файли ... Я ненавиджу їх. У всякому разі, я зняв неоднозначну частину. Хороший коментар, +1.
mrucci

1
Спасибі, мруччі та Деннісу. Я подумав, що там повинно бути щось просте.
dnkb

Здається, кожну проблему, яку я маю з текстовою маніпуляцією, я вдається вирішити sed. Я не впевнений, що я повинен вам дякувати за те, що ви зробили sedще корисніше для мене, але все одно буду. ;)
Джеймі

1

Ви спробували свою версію? Це спрацювало? Тому що я думаю, що це в основному гарна ідея. Я б хотів трохи по-іншому:

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

Це сприйме будь-які символи у слові, яке не є пробілом, і прийме більше одного пробілу між першими двома словами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.