Как исправить команду unix `join`, вставляющую ^ M между столбцами соединения? -Unix

Итак, я наказал свой маленький мозг, подтолкнул и придумал уродливое решение .

Я не думаю, что это лучший вариант, поэтому я все равно буду признателен / принять любую помощь и улучшения!

git log 7.2.0..HEAD --oneline | 
    grep -iEo "([a-f0-9]{7})(.*[a-zA-Z0-9]{2,6}-[0-9]{1,4})+" | 
    sort -u | 
    sed -E $'s/([a-f0-9]{7}|[a-zA-Z0-9]{2,7}-[0-9]{1,4})/ \\\n\\1\\\n/g' | 
    grep -iEo "([a-f0-9]{7}|[a-zA-Z0-9]{2,6}-[0-9]{1,4})+" | 
    tr '\n' ' ' | 
    sed -E $'s/([a-f0-9]{7})/\\\n\\1 →/g' | 
    sed -E 's/([a-zA-Z0-9]{2,7}-[0-9]{1,4})/\1,/g' | 
    sed -E 's/(..)$//'

эта команда разбивает совпадающие выражения на несколько строк, используя sed для вставки некоторого \ n , затем grep снова необходимые мне выражения, и только держит их. Затем, наконец, он возвращается и заменяет эти \ n символами и , соответственно, а затем обрезает последние , .

В итоге я получаю:

58dbb08 → ABC-123
5a9c5e1 → XYZ-987
6070ee0 → MNO-456, MNO-999

Я считаю, что это достаточно быстро при размере журнала менее 200 коммитов ... его цель - помочь сгенерировать некоторые списки проблем в примечаниях к выпуску, так что это не должно ' Это намного больше. Но опять же; любые улучшения скорости / качества приветствуются!

1
12.05.2017, 17:22
2 ответа

^M означает, что вы переносите/редактируете файл в Windows.

Используйте команду dos2unix над файлами, чтобы преобразовать их в текстовый режим Unix.

DOS использует возврат каретки и перевод строки "\r\n" в качестве конца строки, в то время как Unix использует только перевод строки "\n". ^M — это визуальное представление «лишних» символов \r.

Чтобы установить команду dos2unix, выполните (в дистрибутивах на базе Debian):

sudo apt-get install dos2unix

или в Mac (MacPorts):

sudo port install dos2unix

Кроме того, вы также можете сделать это с помощью sed, как показано ниже:

sed 's/\r$//' dosfile.txt > unixfile.txt
3
27.01.2020, 23:19

join(1) (по крайней мере, версия, которую я использую) не добавляет ^M или возврат каретки к объединенным файлам; Однако join с радостью скопирует ^M. Hex viewer плюс некоторые тестовые примеры могут показать, что происходит:

$ echo "1 a" > test1
$ echo "1 b" > test2
$ join test1 test2 | od -bc
0000000   061 040 141 040 142 012                                        
           1       a       b  \n                                        
0000006
$

И тестовый пример, где во входных файлах есть ^M:

$ perl -E "say qq(1 a\r)" > test1
$ perl -E "say qq(1 b\r)" > test2
$ join test1 test2 | od -bc
0000000   061 040 141 015 040 142 015 012                                
           1       a  \r       b  \r  \n                                
0000010
$ 

Существуют различные способы исправления входных файлов, помимо dos2unix можно также использовать tr (хотя это было бы ужасной идеей, если файл использует древнюю традицию MacOS \r в качестве разделителя строк):

$ od -bc test1
0000000   061 040 141 015 012                                            
           1       a  \r  \n                                            
0000005
$ tr -d '\r' < test1 > foo
$ mv foo test1
$ od -bc test1            
0000000   061 040 141 012                                                
           1       a  \n                                                
0000004
$ 
1
27.01.2020, 23:19

Теги

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