2014-12-17 1 views
0

Рассмотрим следующие строки:заменить слово в строке, если есть данная строка с использованием СЭД

function 12345 filename.pdf 6789 12 
function 12345 filename.doc 7789 4567 

Есть ли способ для поиска строк с использованием СЭД, чтобы увидеть, если они содержат в формате PDF или DOC подстроки, и замените строки на следующее?

function_pdf 12345 filename.pdf 6789 12 
function_doc 12345 filename.doc 7789 4567 
+0

awk подходит для этого. –

+0

Все строки содержат либо .doc, либо .pdf. Также количество слов в каждой строке меняется. – Reza

+0

Вы хотите удалить четвертый столбец из строки, когда третий столбец заканчивается '.doc' или' .pdf', и вы хотите добавить '_doc' или' _pdf' в первый столбец? –

ответ

1

Вы действительно не указали проблему должным образом, но, возможно, вы ищете:

sed -e '/\.pdf/s/function/function_pdf/g' -e /\.doc/s/function/function_doc/g' 
+0

У вас отсутствует '' '. И поскольку fedorqui прокомментировал мой ответ,' g' не требуется. Хорошее решение. – fredtantini

+1

С 'g' это недостаточно тщательно, так как это может заменить слишком много. Также' \. pdf' (и т. д.) недостаточно ограничено возможным возможным расположением. –

+0

@William Pursell Работает отлично. – Reza

1

Использование СЭД:

~$ cat i.txt 
function 12345 filename.pdf 6789 
function 12345 filename.doc 7789 
function 12345 filename.txt 8888 
~$ sed -e 's/\(function\) \(.*\)\(pdf\|doc\)\(.*\)/\1_\3 \2\3\4/' i.txt 
function_pdf 12345 filename.pdf 6789 
function_doc 12345 filename.doc 7789 
function 12345 filename.txt 8888 

Захват расширение с регулярным выражением вы хотите, а затем вставьте его там, где вы хотите использовать \x обозначения.
От человека СЭД:

специальных побегов \ 1 до \ 9 для обозначения соответствующего совпадающего подвыражения в регулярном выражении.

+0

Собирался опубликовать :( – Maroun

+1

@fedorqui действительно. Плохие привычки ... – fredtantini

+0

@fredtantini все мои строки заканчиваются двойной цитатой ». Команда sed делает все, как ожидалось, но падает последняя двойная цитата – Reza

1

Через СЭД,

$ sed 's/^\([^[:space:]]\+\)\([^[:space:]]\+ [^[:space:]]\+\.\)\(pdf\|doc\)/\1_\3\2\3/g' file 
function_pdf 12345 filename.pdf 6789 12 
function_doc 12345 filename.doc 7789 4567 
0

С AWK:

awk '$1=="function" && ($3 ~ /\.(pdf|doc)$/) {$1=$1 "_" substr($3,length($3)-2)}7' 
0
sed 's/\(.*\.\)\([^ ]*\)\(.*\)/_\2&/' YourFile 

Самый простой sed, который я нашел для этого (sed кажется очень эффективным для этого)