2015-07-08 6 views
0

Я новичок в сценариях Unix, и я пытаюсь написать скрипт, который должен иметь возможность добавлять новый символ строки и печатать значения внутри переменной в новую строку, вместо той же строки ,Вставить новую строку в переменную unix после некоторого регулярного выражения

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

Строки, которые будут храниться в переменной в новом формате строки:

"CA 1938" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" "CA 1937" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" "CA 1934" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 

Мое мышление было написать некоторые сравнения регулярных выражений и использовать, чтобы запустить вставку новой строки в этом varaiable.Below это код, с которым Я хочу добиться этой операции.

var="CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
for i in $var; do 
    #echo $i 
    p="$p"$'\n'"$i" 
done 
echo "$p" 

Ожидаемый выход

CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

Фактический выход

CA 
1938 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
CA 
1937 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
CA 
1934 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

Так выше фактический выход подходит, потому что $i это все строковые значения, которые разделены пробелами. Не могли бы вы помочь мне в получении того, что я ищу. На самом деле это CA (номер задания) и XX (описание задачи).

+0

Я думаю, что ваш пример сломана. Вы определяете 'var', используя обратные ссылки, и никогда не используете его. Кроме того, 'p' и' i' никогда не определяются. Я также сомневаюсь, что «do ... done» был преднамеренным без цикла. –

ответ

2

Это должно работать:

var='CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' 
var="${var// CA/$'\n'CA}" 
echo "$var" 

Выход:

CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
+1

Вы попадаете в CA вместо другого выражения. Мне нравится, спасибо. –

0

Использование grep -o вы можете сделать это:

var='CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' 

grep -oE 'CA\s+\S+\s+\S+' <<< "$var" 
CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
+0

Спасибо большое. Не могли бы вы немного рассказать о CA \ s + \ S + \ s + \ S +. –

+1

'grep' напечатает каждую соответствующую строку на собственной строке. Он ищет текст 'CA', за которым следует одно или несколько пробелов' \ s + ', одно или несколько не-пробелов' \ S + '(ваши' 1938', '1937' и т. Д.), Одно или несколько пробелов, затем одно или больше не-пробелов (ваш 'XXXXXX ...'). –

+0

@ Mr.Llama: Большое спасибо за ваш комментарий. Да, действительно, это то, что делает регулярное выражение. – anubhava

0

Вы не разбор входа правильно, for сломается var в пробельные разделенные части (на основе IFS), так что вы на самом деле добавление новой строки для каждого «слова» в var, а не каждый токен.

Как вы предложили, я хотел бы использовать регулярные выражения с sed -r правильно разобрать его, и сохранить его в переменной:

p=$(echo $var | sed -r 's/(CA \S+ \S+)/\1\n/g') 

\S соответствует любому символу, + матчи «один или более символов» , поэтому регулярное выражение разбивает ввод на строки в каждом «CA», за которым следуют два слова.

Смежные вопросы