Используйте sed для замены последнего пробела в каждой строке запятой, затем удалите все пробелы

Вы не можете, DVD + R - это диск с записью, только для чтения. вы можете прочитать об этом здесь

7
задан 15 June 2017 в 21:02

12 ответов

Что-то вроде:

sed -r 's/(.*) /\1,/; s/ //g'

Первая подстановка, являющаяся жадным, будет охватывать все, кроме последнего пространства в группе, заменяя последнее на ,. Второй будет устранять остальные.

8
ответ дан 22 May 2018 в 21:30
  • 1
    Он работает неправильно: / (заменяет пробел между линией, кроме последней). – Ravexina 15 June 2017 в 22:07
  • 2
    @Thor Теперь это правильно;) – Ravexina 15 June 2017 в 22:44
  • 3
    @Thor спасибо! Моя клавиатура была PITA, так как я проливал на нее кофе. :( – muru 16 June 2017 в 03:50
  • 4
    @muru rule of IT, Software Engineering и Engineering # 1: Вы не должны проливать свой кофе, но потребляете его полностью, чашку чашкой – Sergiy Kolodyazhnyy 16 June 2017 в 03:53
  • 5
    Простое решение: sed 's/.* /&,/;s/ //g'. Когда все пробелы удаляются так или иначе, не имеет смысла добавлять запятую после последнего пробела, поэтому вам не нужно это \1 и расширенное RE. – Philippos 15 August 2017 в 14:45

Что-то вроде:

sed -r 's/(.*) /\1,/; s/ //g'

Первая подстановка, являющаяся жадным, будет охватывать все, кроме последнего пространства в группе, заменяя последнее на ,. Второй будет устранять остальные.

8
ответ дан 18 July 2018 в 11:35

Что-то вроде:

sed -r 's/(.*) /\1,/; s/ //g'

Первая подстановка, являющаяся жадным, будет охватывать все, кроме последнего пространства в группе, заменяя последнее на ,. Второй будет устранять остальные.

8
ответ дан 24 July 2018 в 19:49

Это выполнит задание:

sed -r "s/\s([0-9]+$)/,\1/" filename.txt | tr -d ' '

или:

sed -r "s/\s([0-9]+$)/,\1/; s/\s//g" filename.txt

Пример ввода:

gi|118592783|ref|ZP_01550172.1|_biphenyl-2 3-diol_1    2-dioxygenase_[Stappia_aggregata_IAM_12614] 1

Выход:

gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1
3
ответ дан 22 May 2018 в 21:30
  • 1
    Мне нравится пример с tr, поскольку он явный, поэтому он более читабель для новых пользователей, но второй sed тоже хорош. – Sergiy Kolodyazhnyy 16 June 2017 в 05:36

Вот вам geeky - с sed loop.

, если шаблон содержит только одно пространство, замените его запятой (иначе) замените первое пространство ничем и goto 1

, который мы можем записать в GNU sed как

sed -e :1 -e '/^[^ ]* [^ ]*$/ s/ /,/' -e 's/ //; t1'

Тестирование:

$ echo 'gi|118592783|ref|ZP_01550172.1|_biphenyl-2  3-diol_1    2-dioxygenase_[Stappia_aggregata_IAM_12614] 1' | 
  sed -e :1 -e '/^[^ ]* [^ ]*$/ s/ /,/' -e 's/ //; t1'
gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1
3
ответ дан 22 May 2018 в 21:30

Perl

$ perl -ne 's/\s//g;s/^(.*)([[:digit:]])$/\1,\2/;print' input.txt                                                                                    
gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1

или короче:

perl -pe 's/\s//g;s/^(.*)([[:digit:]])$/\1,\2/' input.txt 

Эффективно это противоположность подхода muru: сначала мы избавляемся от всех пробелов, а затем группируем все до последнего элемента (группа \1) и последний элемент (группа \2, два, которые являются цифрами). Мы заменяем строку группой \1 и \2, разделяемой запятой.

Обратите внимание, что ([[:digit:]]) можно изменить на (.) для ссылки на любой символ, если это необходимо (т. Е. Если мы ожидаем, что последний символ будет любого типа), или мы можем использовать ([[:graph:]]) для обработки только печатных символов

3
ответ дан 22 May 2018 в 21:30

Это выполнит задание:

sed -r "s/\s([0-9]+$)/,\1/" filename.txt | tr -d ' '

или:

sed -r "s/\s([0-9]+$)/,\1/; s/\s//g" filename.txt

Пример ввода:

gi|118592783|ref|ZP_01550172.1|_biphenyl-2 3-diol_1 2-dioxygenase_[Stappia_aggregata_IAM_12614] 1

Выход:

gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1
3
ответ дан 18 July 2018 в 11:35

Perl

$ perl -ne 's/\s//g;s/^(.*)([[:digit:]])$/\1,\2/;print' input.txt gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1

или короче:

perl -pe 's/\s//g;s/^(.*)([[:digit:]])$/\1,\2/' input.txt

Эффективно это противоположность подхода muru: сначала мы избавляемся от всех пробелов, а затем группируем все до последнего элемента (группа \1) и последний элемент (группа \2, два, которые являются цифрами). Мы заменяем строку группой \1 и \2, разделяемой запятой.

Обратите внимание, что ([[:digit:]]) можно изменить на (.) для ссылки на любой символ, если это необходимо (т. Е. Если мы ожидаем, что последний символ будет любого типа), или мы можем использовать ([[:graph:]]) для обработки только печатных символов

3
ответ дан 18 July 2018 в 11:35

Вот вам geeky - с sed loop.

, если шаблон содержит только одно пространство, замените его запятой (иначе) замените первое пространство ничем и goto 1

, который мы можем записать в GNU sed как

sed -e :1 -e '/^[^ ]* [^ ]*$/ s/ /,/' -e 's/ //; t1'

Тестирование:

$ echo 'gi|118592783|ref|ZP_01550172.1|_biphenyl-2 3-diol_1 2-dioxygenase_[Stappia_aggregata_IAM_12614] 1' | sed -e :1 -e '/^[^ ]* [^ ]*$/ s/ /,/' -e 's/ //; t1' gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1
3
ответ дан 18 July 2018 в 11:35

Это выполнит задание:

sed -r "s/\s([0-9]+$)/,\1/" filename.txt | tr -d ' '

или:

sed -r "s/\s([0-9]+$)/,\1/; s/\s//g" filename.txt

Пример ввода:

gi|118592783|ref|ZP_01550172.1|_biphenyl-2 3-diol_1 2-dioxygenase_[Stappia_aggregata_IAM_12614] 1

Выход:

gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1
3
ответ дан 24 July 2018 в 19:49
  • 1
    Мне нравится пример с tr, поскольку он явный, поэтому он более читабель для новых пользователей, но второй sed тоже хорош. – Sergiy Kolodyazhnyy 16 June 2017 в 05:36

Perl

$ perl -ne 's/\s//g;s/^(.*)([[:digit:]])$/\1,\2/;print' input.txt gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1

или короче:

perl -pe 's/\s//g;s/^(.*)([[:digit:]])$/\1,\2/' input.txt

Эффективно это противоположность подхода muru: сначала мы избавляемся от всех пробелов, а затем группируем все до последнего элемента (группа \1) и последний элемент (группа \2, два, которые являются цифрами). Мы заменяем строку группой \1 и \2, разделяемой запятой.

Обратите внимание, что ([[:digit:]]) можно изменить на (.) для ссылки на любой символ, если это необходимо (т. Е. Если мы ожидаем, что последний символ будет любого типа), или мы можем использовать ([[:graph:]]) для обработки только печатных символов

3
ответ дан 24 July 2018 в 19:49

Вот вам geeky - с sed loop.

, если шаблон содержит только одно пространство, замените его запятой (иначе) замените первое пространство ничем и goto 1

, который мы можем записать в GNU sed как

sed -e :1 -e '/^[^ ]* [^ ]*$/ s/ /,/' -e 's/ //; t1'

Тестирование:

$ echo 'gi|118592783|ref|ZP_01550172.1|_biphenyl-2 3-diol_1 2-dioxygenase_[Stappia_aggregata_IAM_12614] 1' | sed -e :1 -e '/^[^ ]* [^ ]*$/ s/ /,/' -e 's/ //; t1' gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1
3
ответ дан 24 July 2018 в 19:49

Другие вопросы по тегам:

Похожие вопросы: