2015-01-20 2 views
1

У меня проблема, когда я использую sed, чтобы извлечь ключевое слово из файла.
Содержание в файле, как:извлечение слова из файла с помощью sed

======================= keyword begin ======================= 
blablabla 
======================== keyword end ======================== 

Тогда я:

$ sed -n 's/=* \(.*\) begin =*/\1/p' test 
keyword ## It is ok 
$ a=`sed -n 's/=* \(.*\) begin =*/\1/p' test` 
$ echo "[$a]" 
]keyword ## Why the output is like this? I think it should be [keyword] 

Я просто не знаю, почему появляются '] ключевое слово.

+3

Невозможно воспроизвести. На какой платформе вы работаете? Какая версия Bash? Он печатает '[keyword]' для меня, как и должно. –

+1

Кажется, все в порядке, пожалуйста, проверьте свою версию Bash, как было предложено @JohnZwinck. – Skynet

ответ

4

Это происходит из-за того, что ваш файл имеет возврат каретки из-за его создания на компьютере под управлением Windows. Удалите их из файла с помощью dos2unix или tr -d '\r'.

Вы можете сказать, потому что \r заставляет терминал начать переписывать одну и ту же строку с самого начала. Если вы напишете [keyword, а затем с начала строки перепишите ], вы получите ]keyword.

Для получения дополнительной информации см. bash tag wiki.

+1

Вы правы. Большое спасибо. – ruanhao

+1

@ruanhao: если этот ответ решил вашу проблему, вы должны «принять» его, нажав галочку слева. –

0

Использование эхо $ а вместо эхо «[$ а]», он будет печатать только ключевое слово

Если вы используете эхо «[$ а]» он будет печатать [ключевое слово]

1

Просто измените ваш sed команда:

a=$(sed -n 's/=* \(.*\) begin =*.*$/\1/p' file) 
echo "[$a]" 
[keyword] 

Это sed будет соответствовать всем = после begin и все остальные символы после окончания = (включая \r).