Suponiendo que está ejecutando bash, coloque el siguiente código cerca del inicio del script que desea obtener pero no ejecutar:
if [ "${BASH_SOURCE[0]}" -ef "$0" ]
then
echo "Hey, you should source this script, not execute it!"
exit 1
fi
En bash, ${BASH_SOURCE[0]}
contendrá el nombre del archivo actual que está leyendo el shell, independientemente de si se está generando o ejecutando.
Por el contrario, $0
es el nombre del archivo actual que se está ejecutando.
-ef
prueba si estos dos archivos son el mismo archivo. Si lo son, alertamos al usuario y salimos.
Ni -ef
ni BASH_SOURCE
son POSIX. Mientras que -ef
es compatible con ksh, yash, zsh y Dash, BASH_SOURCE
requiere bash. En zsh
, sin embargo, ${BASH_SOURCE[0]}
podría ser reemplazado por ${(%):-%N}
.
Глядя на ваш шестнадцатеричный дамп, может показаться, что это должно решить вашу проблему:
tr -d '\015' < input > log
Поскольку восьмеричное \ 015
- это возврат каретки
^ Символ M
.
Почему dos2unix
не помогло, так это потому, что dos2unix
просматривает последовательность \ r \ n
, которой нет в вашем случае.
Может быть лучший вариант sed
, но вот один:
sed -n -e '/,/!{N;s/\n//;}; /,/p' input > output
В нем говорится (по умолчанию, не печатая строки): если в строке есть запятая, то прочитайте строку next и замените новую строку. Затем, если в строке есть (сейчас или уже) запятая, распечатайте строку. Он считывает данные с input
и записывает в output
. С некоторыми seds вы можете использовать флаг sed -i
для редактирования файла на месте.
Входной образец:
device_id,ip_address,serial_number
SEP0c1167231746, 148.000.000.32
SEP0c1167223fa5, 148.000.000.30
SEP0c1167231746
, 148.000.000.32
SEP0c1167223fa5
, 148.000.000.30
Образец выходных данных:
device_id,ip_address,serial_number
SEP0c1167231746, 148.000.000.32
SEP0c1167223fa5, 148.000.000.30
SEP0c1167231746, 148.000.000.32
SEP0c1167223fa5, 148.000.000.30