POSIX sed
(и, например, OS X sed
, sed
ниже) требуют, чтобы i
сопровождался обратной косой чертой и переводом строки.Также, по крайней мере, sed
в OS X не включает новую строку после вставленного текста:
$ seq 3|gsed '2i1.5'
1
1.5
2
3
$ seq 3|sed '2i1.5'
sed: 1: "2i1.5": command i expects \ followed by text
$ seq 3|sed $'2i\\\n1.5'
1
1.52
3
$ seq 3|sed $'2i\\\n1.5\n'
1
1.5
2
3
Чтобы заменить строку, вы можете использовать команды c
(изменить) или s
(заменить)с числовым адресом:
$ seq 3|sed $'2c\\\n1.5\n'
1
1.5
3
$ seq 3|gsed '2c1.5'
1
1.5
3
$ seq 3|sed '2s/.*/1.5/'
1
1.5
3
Альтернативы, использующие awk
:
$ seq 3|awk 'NR==2{print 1.5}1'
1
1.5
2
3
$ seq 3|awk '{print NR==2?1.5:$0}'
1
1.5
3
awk
интерпретирует обратный слеш в переменных, переданных с -v
, но не в переменных, переданных с помощью ENVIRON
:
$ seq 3|awk -v v='a\ba' '{print NR==2?v:$0}'
1
a
3
$ seq 3|v='a\ba' awk '{print NR==2?ENVIRON["v"]:$0}'
1
a\ba
3
И ENVIRON
, и -v
определяются POSIX.