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

У меня возникли проблемы с загрузкой текстового файла с разделителями-пробелами в таблицу. Данные в этом текстовом файле генерируются терагеном и, следовательно, являются просто фиктивными данными, где есть только 2 столбца, а первый столбец содержит значения случайных строк специальных символов.

Пример:

~~~{ZRGHS|

~~~{qahVN)

Я сталкиваюсь с проблемой и получаю отклоненные строки, потому что в некоторых из этих значений есть пробел в виде случайного символа ASCII, из-за чего он думает, что есть 3 столбца, когда в моей таблице их 2, поэтому они отклоняются.

Итак, что я хочу сделать, так это удалить только первый пробел из этих отклоненных строк, которые нужно будет повторять несколько раз в каждой строке, а затем попытаться перезагрузить их. Будет ли sed лучшим способом сделать это, или что-то другое, например tr, будет более подходящим?

Спасибо!


person user2432819    schedule 07.01.2014    source источник
comment
sed справился бы с этой задачей, но с этим справятся многие инструменты. Делайте это с тем, с кем вам удобнее.   -  person Wrikken    schedule 08.01.2014


Ответы (3)


Насколько я понимаю, вы хотите удалить все пробелы, кроме последних двух.

  • Вы можете создать регулярное выражение для этого или использовать тот факт, что очень легко сохранить первые n вхождений:

    $ echo 'one two three four' | rev | sed 's/ //2g' | rev
    onetwothree four
    

    или, с файлом:

    rev myfile | sed 's/ //2g' | rev
    
  • Или вы можете удалить один пробел, пока не останется только один пробел:

    $ echo 'one two three four' | sed ':a;/ .* /{s/ //;ba}'
    onetwothree four
    

    с файлом:

    sed ':a;/ .* /{s/ //;ba}' myfile
    
  • Или, если у вас есть настроение, вы можете разделить строку, поиграть с ней и собрать ее обратно (предполагается GNU sed):

     $ echo 'one two three four' | sed -r 's/(.*)([^ ]+) ([^ ]+)$/\1\n\2 \3/;h;s/\n.*//;s/ //g;G;s/\n.*\n//'
    onetwothree four
    

    с файлом:

    sed -r 's/(.*)([^ ]+) ([^ ]+)$/\1\n\2 \3/;h;s/\n.*//;s/ //g;G;s/\n.*\n//' myfile
    
person Lev Levitsky    schedule 07.01.2014
comment
Да, это то, что я хочу сделать, но для каждой строки, так что это нужно будет повторить несколько раз, где каждая строка разделена \n - person user2432819; 08.01.2014
comment
@user2432819 user2432819 Вот как работает sed, просто дайте ему имя файла, и он применит команду к каждой строке. - person Lev Levitsky; 08.01.2014
comment
хорошо, если бы я хотел использовать эту команду для файла, я бы sed -i | оборот | сед | 's///2g' | rev file.txt работает? - person user2432819; 08.01.2014
comment
Большое спасибо! Последние примеры выглядят очень сложными, но я хотя бы попробую пример с файлом out, а потом узнаю подробнее о каждой части команды. У меня очень мало опыта работы с sed, и я знаю только самые основы. - person user2432819; 08.01.2014
comment
@user2432819 user2432819 Третий для моего собственного развлечения, но два других более понятны. Не стесняйтесь задавать вопросы здесь, в комментариях, и принять ответ, если считаете его уместным. - person Lev Levitsky; 08.01.2014

Чтобы удалить первый пробел из строки, используйте

echo "my line with spaces" | sed 's/ //'

В зависимости от специфики вашего подхода (фиксированная длина столбца? как вы добавляете данные?) может быть лучший способ сделать это за один шаг вместо повторного анализа отклоненных строк.

person Sir Athos    schedule 07.01.2014
comment
Я загружаю данные с помощью команды копирования и указываю синтаксический анализатор или разделитель, который представляет собой пробел, ' '. И это сработало, за исключением отклоненных строк, которые все были помещены в файл. - person user2432819; 08.01.2014

Чтобы удалить/удалить 1-й символ из строки:

function stringStripStart { echo ${1:1:${#1}} }

Аналогично удалению трейлингового персонажа:

function stringStripEnd { FINAL_LEN=${#1}-1 echo ${1:0:$FINAL_LEN} }

Примечание. для пустой строки необходимо добавить дополнительное условие.

person To Kra    schedule 17.11.2017