Unix: не может добавить "\\ \ n" даже с выходом в конец строки - PullRequest
2 голосов
/ 22 апреля 2010

Я пытаюсь преобразовать чистые данные по столбцам в таблицы в текс. Я не могу иметь "\ \ n" на каждом конце строки. Пожалуйста, смотрите команду в конце.

Данные

$ . ./bin/addTableTexTags.sh < .data_3
10.31 & 8.50 & 7.40 
 10.34 & 8.53 & 7.81 
 8.22 & 8.62 & 7.78 
 10.16 & 8.53 & 7.44 
 10.41 & 8.38 & 7.63 
 10.38 & 8.57 & 8.03 
 10.13 & 8.66 & 7.41 
 8.50 & 8.60 & 7.15 
 10.41 & 8.63 & 7.21 
 8.53 & 8.53 & 7.12 

$ cat .data_3 
10.31 8.50 7.40
10.34 8.53 7.81
8.22 8.62 7.78
10.16 8.53 7.44
10.41 8.38 7.63
10.38 8.57 8.03
10.13 8.66 7.41
8.50 8.60 7.15
10.41 8.63 7.21
8.53 8.53 7.12

addTableTexTags.sh

#!/bin/bash

sed -e "s@[[:space:]]@\t\&\t@g" -e "s@[[:space:]]*&*[[:space:]]*\$@\t \\  \\\\n@g" 
 // Tried Escaping "\\" with "/" here and there 
 // but cannot get a line ending with "\\ \n".

Ответы [ 2 ]

2 голосов
/ 22 апреля 2010

вот более простой способ без большого количества регулярных выражений. Просто установите разделитель выходного поля (OFS).

$ awk '{$1=$1}1' OFS=" & " file
10.31 & 8.50 & 7.40
10.34 & 8.53 & 7.81
8.22 & 8.62 & 7.78
10.16 & 8.53 & 7.44
10.41 & 8.38 & 7.63
10.38 & 8.57 & 8.03
10.13 & 8.66 & 7.41
8.50 & 8.60 & 7.15
10.41 & 8.63 & 7.21
8.53 & 8.53 & 7.12

эквивалент этого: awk '{$1=$1}1' OFS=" & " .data | sed -e 's@$@\\\\@g' что у вас есть.

awk '{$1=$1;$0=$0"\\\\"}1' OFS=" & " file

когда вы используете awk, нет необходимости использовать sed.

2 голосов
/ 22 апреля 2010

Если вы хотите, чтобы каждая строка заканчивалась парой обратной косой черты, пробелом, другой обратной косой чертой и символом 'n' (за которым следует символ новой строки), то:

sed 's/$/\\\\ \\n/'

Если это не то, что вы хотите, пожалуйста, объясните, что вы хотите.

Одиночные кавычки мешают оболочке портиться с обратными слешами. С двойными кавычками это становится:

sed "s/\$/\\\\\\\\ \\\\n/"

Да - 8 зазоров подряд! Веселье, не правда ли?


Адаптировать его к цитируемому вами сценарию сложно. Первый термин использует «\t», но неясно, будет ли это табуляция или фактическая обратная косая черта и буква «t».

sed -e 's@[[:space:]]@\t\&\t@g' \
    -e 's@[[:space:]]*&[[:space:]]*$@\\\\ \\n@g'

Если вам нужны фактические вкладки в выводе, я обычно печатаю их как вкладки (убедившись, что у меня не установлен vim для расширенных таблиц в то время). Если мне нужно расширить '\t', то я обычно использую Perl, поскольку знаю его правила, и разные оболочки имеют разные представления о правилах. Обратите внимание, что я опустил '*' сразу после '&' в последнем матче; Я думаю, вы хотели, чтобы '&', добавленное предыдущим правилом, было удалено.

...