Intereting Posts

Bash удаляет все символы после шаблона с помощью awk

У меня есть входной файл в следующей форме:

something here somethingElseHere^[%-somestuff here ^[%-somestuff here 

Обратите внимание, что ^[ является escape-символом \x1b .

Итак, что я пытаюсь сделать, это удалить все в файле после первого ^[ возникновения, в сценарии bash, поэтому мне должно получиться что-то вроде этого:

 something here somethingElseHere 

Моим решением было: awk -F "\x1b" {'print $1'} но это дает это как результат:

 something here somethingElseHere (empty line here) 

Таким образом, он добавляет лишнюю пустую строку после последней. Тем не менее, если я удалю его вручную, я получаю дополнительный байт. Я сделал программу на C ++, которая читает файл до \x1b и записывает все прочитанные символы в отдельном файле, но с AWK, после удаления дополнительной строки, я все равно получаю 1 байт больше, чем это делает с C ++.

Редактировать:

возможно, это символ EOL, который добавляется при использовании AWK? Я не добавляю его при использовании программы на C ++.

ОБНОВИТЬ:

Я только что пробовал некоторые команды, и большинство из них работают, если я их открываю в vi , но у них есть дополнительный байт, и я не могу понять, откуда он.

 $hexdump -x file1 0000000 4329 706f 7279 6769 7468 6328 2029 3931 0000010 3939 4d20 6369 6f72 6f73 7466 4320 726f 0000020 6f70 6172 6974 6e6f 610a 6362 6564 6766 0000030 6968 6b6a 6d6c 6f6e 7170 7372 7574 7776 0000040 7978 534d 5020 4c43 4c58 6f46 746e 3020 0000050 3130 a8f8 4955 0a42 0000058 $hexdump -x file2 0000000 4329 706f 7279 6769 7468 6328 2029 3931 0000010 3939 4d20 6369 6f72 6f73 7466 4320 726f 0000020 6f70 6172 6974 6e6f 610a 6362 6564 6766 0000030 6968 6b6a 6d6c 6f6e 7170 7372 7574 7776 0000040 7978 534d 5020 4c43 4c58 6f46 746e 3020 0000050 3130 a8f8 4955 0042 0000057 

В file1, который я генерирую с помощью bash, он добавляет дополнительный 0x0a (новый символ строки).

Вот решение с GNU sed :

 sed -z 's/\x1b.*//' 

И ниже это решение с awk , основанное на комментариях OP:

 awk -F '\x1b' 'NF > 1 { printf "%s", $1; exit } 1' 

У вас должно быть веское основание не хотеть окончания новой строки, но имейте в виду, что обычный текстовый файл должен быть завершен в новой строке.