sed одинаково относится к символам перевода строки и обычному символу? - PullRequest
0 голосов
/ 18 ноября 2018

Учитывая файл данных tmp_file,

5 0 0 0
0 5 0 0
0 0 6 0
0 0 0 6

следующие две команды дают разные результаты, почему?

sed 's/\n/ /g' tmp_file
5 0 0 0
0 5 0 0
0 0 6 0
0 0 0 6

sed 's/0/ /g' tmp_file  
5      
  5    
    6  
      6

EDIT:

предыдущее сообщение, Как я могу заменить символ новой строки (\ n) с помощью sed? было предложено решить проблему. Конечно, решение то же самое, но вопрос выглядит, по-видимому, другим в глазах новичка. Кроме того, не стоит ожидать, что кто-нибудь сможет найти правильный ответ среди миллионов постов, даже если часами исследования в Интернете, как это делается в текущем посте. Я предпочел бы отозвать сообщение, если будет дан отрицательный знак из-за того, что он похож на предыдущие сообщения.

1 Ответ

0 голосов
/ 18 ноября 2018

Давайте попробуем понять, как sed читает Input_file, поэтому sed читает строки по разделителю, который сам по себе является новой строкой.Это означает, что если строки разделены новой строкой, то в одной строке НЕ МОЖЕТ быть новая строка, пока / пока мы не дадим sed знать, что нужно прочитать весь Input_file в цикле, а затем заменить новые строки (вид хранения значений в удерживающем пространствеэто функциональные возможности, предоставляемые sed для сохранения значений в памяти для рабочих целей).Вот почему ваша первая команда НЕ оказывает никакого влияния, так как sed не нашла ни одной строки, в которой есть новая строка.

Вот очень хорошая тема ( Как я могу заменить новую строку (\ n) используя sed? ) Я обнаружил, что через SO вы можете ознакомиться с его решением и его объяснением (взятым из этого потока) следующим образом.

sed ':a;N;$!ba;s/\n/ /g' Input_file

Объяснение вышекод:

1-Создать метку с помощью: a.

2- Присоединить текущую и следующую строку к пространству шаблона с помощью N.

3- Если мы находимся перед последней строкой, переходите к созданной метке $! Ba ($! Означает не делать этого в последней строке, так как должен быть один последний перевод строки).

4- Наконец подстановказаменяет каждую новую строку пробелом в пространстве образца (который является целым файлом).

Я хотел добавить свое объяснение выше, а затем добавить детали этого потока.

...