2014-10-08 5 views
0

Я попытался найти последнее вхождение в файл с помощью sed. В опции HP-UX tac недоступно.KSH: команда sed для поиска и замены последнего вхождения строки в файл

Для Ex: Ниже приведены данные в файле,

A|2121212|666666666 | 2|01|2 |B|1111111111 |234234234 |00001148| 
B|2014242|8888888888| 3|12|3 |B|22222222222 |45345345 |00001150| 
C|4545456|4444444444| 4|31|4 |B|3333333333333 |4234234 |00001148| 

Пытаюсь:

cat $filename | sed 's/00001148/00001147/g' 

Он меняется от 00001148 до 00001147 как для возникновения 00001148.

Я должен найти |00001148| последнего вхождения и заменить другим номером. В настоящее время моя команда СЭД меняется как два экземпляра 00001148.

+0

Соответствует ли строка последней строке файла? – nu11p01n73R

+0

Да, моя команда соответствует и заменяет 00001147 как в первой, так и в последней строке. Но я хочу изменить только в последней строке соответствия. – Srinivas

+0

Обратите внимание, что использование 'cat' полностью UUOC - бесполезное использование' cat'. 'sed' отлично умеет читать файлы. –

ответ

4

EDIT

Чтобы соответствовать последней строке, используйте $

sed '$s/00001148/00001147/g' $filename 

даст выход в

A|2121212|666666666 | 2|01|2 |B|1111111111 |234234234 |00001148| 
B|2014242|8888888888| 3|12|3 |B|22222222222 |45345345 |00001150| 
C|4545456|4444444444| 4|31|4 |B|3333333333333 |4234234 |00001147| 

Если соответствующая строка является последней строкой в файл, используйте tail вместо cat

tail -1 $filename | sed 's/00001148/00001147/g' 

Команда tail выбирает последний (хвост) линий образуют файл, здесь указано взять 1 линия USInt -1 вариант

если это не последняя строка ,

grep "00001148" $filename | tail -1 | sed 's/00001148/00001147/g' 

команда grep находит все occureences и tail выбирает последнюю строку и sed делает замену.

+0

Обе команды получат только 1 строку с замененной строкой 00001147, но мне нужны оставшиеся данные в файле с замененной строкой.Так что мне нужно заменить последнюю строку на выход строки из приведенной выше команды? – Srinivas

+0

Я пробовал sed '$ s/00001148/00001147/g' $ имя файла, но не заменил последнее вхождение строки. Но я что-то изменил, sed "5, $ s/00001147/00001146/g" $ filename. Он ищет шаблон и заменяет его в 5-й строке. – Srinivas

+0

Ваш ввод не ясен. '$' заменяет, если в последней строке есть проблема. если не он ничего не делает. Начиная с '5, $' он заменяет все вхождения между 5-й строкой и последней строкой, если он заменяет вашу 5-ю строчку, тогда она появляется только на 5-й строке – nu11p01n73R

0

Путь с AWK и СЭД

sed '1!G;h;$!d' file | awk '/00001148/&&!x{sub("00001148","00001147");x=1}1' | sed '1!G;h;$!d' 

Может Probs все это может быть сделано в СЭД, хотя

0
sed -n '1!H;1;h;${x;s/\(.*\|\)00001148\|/&OtherNumberHere\|/;p;}' YourFile 

СЕПГ пытается получить наибольшее содержание в шаблоне поиска, поэтому, начало формы по умолчанию в последняя | 00001148 | (если есть)