2012-04-13 22 views
6

Mój plik wygląda tak:bash zastąpienie pierwszego znaku w każdym wierszu

1 chrX_73833098_73834098 
    1 chrX_73889652_73890652 
    1 chrX_91194501_91195501 
    1 chrX_92000157_92001157 
    1 chrX_92106500_92107500 

Chcę zastąpić pierwszy znak "1" do 0. Poszukiwane wyjście jest:

0 chrX_73833098_73834098 
    0 chrX_73889652_73890652 
    0 chrX_91194501_91195501 
    0 chrX_92000157_92001157 
    0 chrX_92106500_92107500 

Próbuje to zrobić z tego:

sed 's/^./0/g' file 

ale wyjście jest:

0  1 chrX_73833098_73834098 
0  1 chrX_73889652_73890652 
0  1 chrX_91194501_91195501 
0  1 chrX_92000157_92001157 
0  1 chrX_92106500_92107500 

Wierzę, że jest łatwy sposób, aby to naprawić, ale nie wiem.

+2

Masz "białe przestrzenie" na początku każdej linii. – kev

Odpowiedz

12

Na początku każdej linii występuje znak odstępu.

można spróbować:

sed 's/^\s*./0/g' file 

\ s - pasuje do białej przestrzeni znaków

wyjściowa:

0 chrX_73833098_73834098 
0 chrX_73889652_73890652 
0 chrX_91194501_91195501 
0 chrX_92000157_92001157 
0 chrX_92106500_92107500 

jeśli chcesz zachować whitespace znaki:

sed 's/^\(\s*\)\(1\)/\10/g' file 

i inni więc zastąpiłem tutaj. z 1

+1

Nie musisz zakotwiczać wzoru na początku linii: po prostu użyj 'sed 's/[[: digit:]]/0 /" plik ", który zmienia tylko pierwszą cyfrę. Aby zmienić pierwszy znak spoza przestrzeni, 's/[^ [: space:]]/0 /'. –

3

Myślę, że jest to łatwy sposób na zrozumienie. Spróbuj:

sed 's/1/0/1' file

wyjściowa:

1 chrX_73833098_73834098 
1 chrX_73889652_73890652 
1 chrX_91194501_91195501 
1 chrX_92000157_92001157 
1 chrX_92106500_92107500 

chcę powiedzieć, że 's/partten/partten/g', ostatnia 'G' oznacza miejsce, w jednej linii.
"1" oznacza pierwszy dopasowany, "g" oznacza wszystko, można również użyć "2g", co oznacza od drugiego do ostatniego.
Spróbuj.

+0

Naprawdę podoba mi się ten, przyszedł tu ponownie tylko po to, aby zdać sobie sprawę, że już głosowałem – DomTomCat

Powiązane problemy