Как заменить последние один или два символа файла инструментами Unix - PullRequest
2 голосов
/ 16 декабря 2009

У меня в конце файла висит запятая, которую я хотел бы заменить на квадратную скобку. Также может быть или не быть символа новой строки в конце файла. Как я могу заменить один или два символа квадратной скобкой, используя обычные инструменты Unix?

Ответы [ 5 ]

2 голосов
/ 17 декабря 2009

Это удалит все завершающие пустые строки, а затем заменит последнюю запятую в файле на ']'

cat origfile | sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' | sed -e '$s/,$/]/'  > outputfile 
2 голосов
/ 17 декабря 2009

Sed может легко сделать замену только в последней строке:

sed '$ s/,/]/g' inputFile

Селектор $ address указывает на последнюю строку.

Если файл заканчивается новой строкой, это, однако, не изменит этого. Это действительно желаемое поведение, или вы просто хотите заменить последнее на]?

1 голос
/ 17 декабря 2009
perl -i -pe'BEGIN{undef$/}s/,\n?\Z/]/'
1 голос
/ 16 декабря 2009

Обычно текстовые файлы должны заканчиваться символом новой строки.

Один из способов отредактировать файл для замены завершающей запятой на закрывающую скобку в последней строке:

ed - $file <<'!'
$s/,$/]/
w
q
!

Переходит к последней строке, заменяет запятую с закрывающей скобкой, пишет и завершает работу. В качестве альтернативы, используя sed:

sed '$s/,$/]/' $file > new.$file &&
mv new.$file $file

Если у вас есть GNU sed, есть опция «перезаписать» ('-i', IIRC).

Если вам нужно иметь дело с именами файлов, а не с содержимым файлов, то:

newname=$(echo "$oldname" | sed 's/,$/]/')

И, несомненно, есть и другие механизмы. Вы также можете использовать Perl или Python; они стремятся к излишнему убыванию для запрошенного примера.

0 голосов
/ 17 декабря 2009

вот более быстрый метод по сравнению с использованием sed для больших файлов, если последняя строка не является новой строкой

head -n -1 file > temp;
s=$(tail -1 file)
echo ${s/%,/]} >> temp
echo mv temp file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...