2015-03-20 3 views
2

Здесь я хочу удалить первый символ файла определенных строк. Например:Удалить первый символ строки certan в файле в сценарии оболочки

>cat file1.txt 
10081551 
10081599 
10082234 
10082259 
20081134 
20081159 
30082232 
10087721 

С 3-й линии на 7-й строке удалить первую команду символ sed или любой другой, и выход будет:

>cat file1.txt 
10081551 
10081599 
0082234 
0082259 
0081134 
0081159 
0082232 
10087721 
+0

'SED '3,7s /^.//'' – anishsane

+1

@anishsane отсутствия необходимости анкера: 'SED«3,7s /.// ''поскольку' g' не используется, '.' будет ударяться только по первому символу. – Jotne

+0

^^ Да, вы правы. Почему-то я привык писать '^ .', для ясности и ... привычки ..: -/ – anishsane

ответ

4
sed -i '3,7s/.//' file1.txt 

sed -i.bak '3,7s/.//' file1.txt # to keep backup 

От 3rd к 7th строке заменить первый символ ни с чем.

+1

комментарии bash начинаются с #, а не внутри/**/;-) – anishsane

+1

Это не был комментарий к bash ... только для того, чтобы OP знал .. я изменюсь, чтобы избежать путаницы :-) спасибо –

+0

Nevermind ... вот почему я добавил a;) в конце .. :-) – anishsane

1

Это просто в любом SED:

sed -i '3,7 s/^.//' 

или Perl:

perl -i -pe 's/^.// if $. >= 3 && $. <= 7' 
+0

Вам не нужно привязывать '.', так как вы нажмете на первого символа в строке и у вас нет' g' global. – Jotne

+0

@ Джотн: Это интересный момент. Вы, конечно, правы; но я думаю, что 's /^.//' яснее. – ruakh

+0

@ruakh: Пожалуйста, предоставьте мне другое решение для редактирования, которое я сделал в этом вопросе.С уважением –

1

Программа sed может сделать это с помощью:

pax$ sed '3,7s/.//' file1.txt 
10081551 
10081599 
0082234 
0082259 
0081134 
0081159 
0082232 
10087721 

заменяя первый символ в строке который соответствует . (который является первым символом на линии).

Я также предоставляю решение awk. Это немного сложнее, но его стоит изучить, поскольку он позволяет выполнять более сложные операции, чем sed.

pax$ awk 'NR>=3&&NR<=7{sub("^.","",$0)}{print}' file1.txt 
10081551 
10081599 
0082234 
0082259 
0081134 
0081159 
0082232 
10087721 
0

Другой вариант awk

awk 'NR~/^[3-7]$/{sub(".","")}1' file 
10081551 
10081599 
0082234 
0082259 
0081134 
0081159 
0082232 
10087721 
1

Для вашего 2 вопроса:

  1. если окончание котировка на последней строке файла:

    sed '$i\ 
        /home/neeraj/yocto/poky/meta-ti \\ 
    ' text 
    
  2. чтобы соответствовать концу продолжающихся линий (это один чувствует хрупким)

    sed ' 
        /BBLAYERS.*"/ { 
         :a 
         /\\$/ {N; ba} 
         [email protected]"[email protected]/home/neeraj/yocto/poky/meta-ti \\\n"@ 
        } 
    ' text