sed удаляют конец строки для определенных строк

Сегодня существуют компании (Red Hat, SUSE/Novell, Канонический), кто готов оказать Вам поддержку и гарантировать, что это не повредится. Люди Enterprisey (кому время простоя часа может легко стоить буквально тысячи долларов) с удовольствием платят для сна обоснованно, зная, что они могут свалить вину в другом месте, когда sh*t поражает вентилятор. BSDs не предлагают ничего как этот. Несомненно, Вы найдете FreeBSD, OpenBSD, NetBSD, Fedora, Debian, CentOS и длинный список других операционных систем "непредприятия" в использовании предприятия, но редко с официальным благословением от PHB или его генерального директора.

4
01.01.2014, 17:24
4 ответа

С awk:

awk '$1 == "NOTOK" {printf "%s", $0; next} 1' file
2
27.01.2020, 20:48
  • 1
    это работает. можно ли добавить объяснение как? –  Tom Klino 01.01.2014, 17:23
  • 2
    Для строк, где NOTOK является первым словом, распечатайте ту строку без новой строки. Иначе распечатайте неизменную строку. "1" очень краткий для 1 {print} –  glenn jackman 01.01.2014, 17:26
  • 3
    Лучше соответствовать NOTOK с тех пор нет никакой гарантии, что строка будет всегда сопровождаться FS. –  terdon♦ 01.01.2014, 19:26
  • 4
    Таким образом, если я понимаю правильно, затем используется, чтобы иметь awk, смотрят на следующую строку, и '1' используется для печати его, как? –  Tom Klino 02.01.2014, 13:02
sed '/NOTOK/ { N; s/\n// }'

Если Ваша sed реализация не поддерживает ; для разделения команд (GNU sed делает, но это не стандартно):

sed -e '/^NOTOK/ {' -e 'N' -e 's/\n//' -e '}'

Sed становится загадочным очень быстро; что-либо это более сложно, чем один или несколько s команды являются хорошим кандидатом на awk.

awk '/^NOTOK/ {printf "%s", $0; next} 1 {print}'

или

awk '/NOTOK/ {getline n; $0 = $0 n} 1'
6
27.01.2020, 20:48

Присоединение к строкам с ed:

cat <<-'EOF' | ed -s file
H
$a

.
,g/^[[:space:]]*NOTOK/.,.+1j
,p
q
EOF

(Примечание: использовать w вместо ,p для оперативного редактирования файла.)

1
27.01.2020, 20:48

Вот некоторые:

  • Perl

    perl -pe 'chomp if /^\s*NOTOK/' file
    

    -p флаг жемчуга заставляет это печатать каждую строку входного файла, -n средства читают строки файлов с методической точностью и применяют сценарий, данный -e. chomp() функция, которая просто удаляет новую строку (\n) от конца строки, таким образом, мы чавкаем, только если строка начинается с NOTOK (/^NOTOK/).

  • awk

    awk '{if($1~/NOTOK/){printf "%s", $0}else{print}}' file
    

    или

    awk '$1~/NOTOK/{printf "%s", $0; next}1;' file
    

    $1 первое поле в awk. Если это соответствует NOTOK мы печатаем строку без новой строки в конце (printf) иначе мы печатаем строку, как.

  • удар

    while IFS="" read line; do 
      if [ $(expr index "$line" "NOTOK") -gt "0" ]; then printf "$line";       
      else echo "$line"; fi;
    done < file
    

    IFS разделитель поля ввода, который должен быть установлен очистить для чтения целых строк (иначе, это получило бы только первое слово). Так, мы читаем каждую строку файла в $line, затем проверьте, начинается ли та строка NOTOK и печать, если без новой строки в конце (printf) или с (эхом) соответственно.

1
27.01.2020, 20:48
  • 1
    Более безопасный использовать printf "%s", $0 - нет никакого способа знать то, что будет в 0$, включая возможный printf % - директивы. –  glenn jackman 01.01.2014, 19:22
  • 2
    @glennjackman ах, вот почему Вы сделали это, тот путь, Достаточно ярмарка, не думал об этом. –  terdon♦ 01.01.2014, 19:23
  • 3
    @terdon: -n не необходимо когда -p используется. –  cuonglm 16.05.2014, 19:39
  • 4
    @Gnouc благодарит, я знаю, он был перенесен от моего тестирования, где я был printлуг явно. Между прочим, у Вас есть более чем достаточно представителя для редактирования, не стесняйтесь просто удалять его, если я делаю что-то глупое как этот снова. –  terdon♦ 16.05.2014, 19:40

Теги

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