2013-12-14 4 views
5

Я знаю, как найти длинные строки в файле, используя AWK или SED:Bash: как найти и разбить длинные строки, вставив символ продолжения и символ новой строки?

$ awk 'length<=5' foo.txt 

будет печатать только строки длиной < = 5.

sed -i '/^.\{5,\}$/d' FILE 

бы удалить все строки с более чем 5 персонажи.

Но как найти длинные строки, а затем разбить их, вставив символ продолжения ('&' в моем случае) и новую строку?

фона:

У меня есть FORtran код, который генерируется автоматически. К сожалению, некоторые строки превышают лимит в 132 символа. Я хочу найти их и разбить их автоматически. Например, это:

this is a might long line and should be broken up by inserting the continuation charater '&' and newline. 

должен стать этим:

this is a might long line and should be broken & 
up by inserting the continuation charater '&' a& 
nd newline. 

ответ

6

Один из способов с sed:

$ sed -r 's/.{47}/&\&\n/g' file 
this is a might long line and should be broken & 
up by inserting the continuation charater '&' a& 
nd newline. 
5

Вы можете попробовать:

awk ' 
BEGIN { p=47 } 
{ 
    while(length()> p) { 
     print substr($0,1,p) "&" 
     $0=substr($0,p+1) 
    } 
    print 
}' file 
3

Это решение не требует sed или awk. Это весело.

tr '\n' '\r' < file | fold -w 47 | tr '\n\r' '&\n' | fold -w 48 

А вот что вы получите:

this is a might long line and should be broken & 
up by inserting the continuation charater '&' a& 
nd newline. 
But this line should stay intact 
Of course, this is not a right way to do it and& 
you should stick with awk or sed solution 
But look! This is so tricky and fun! 
1

подобно тому, как код sudo_O, но сделать это в AWK

awk '{gsub(/.{47}/,"&\\&\n")}1' file 
Смежные вопросы