2012-03-28 2 views
1

скажем, у меня есть следующий текст в файле с именем letters.txt:Bash - скопировать строку в позиции X до конца строки

ABCDEFGHIJKLMNOPQRST 

И я хочу, чтобы скопировать позицию 2-3 (BC) до конца строки, как это:

ABCDEFGHIJKLMNOPQRSTBC 

Я попытался заменить \ n на позицию 2-3 плюс \ n, но это не сработает. Пример:

sed -r "~ s/\n/\^(.{1})(.{2})\n/" letters.txt > letters_new.txt 

Как я могу сделать это с помощью bash? Я искал ответ, но не нашел.

+0

вы могли бы использовать старт согласования регулярных выражений строки ('^') и добавить группу матч, содержащий символы в положении 2 -3 до конца строки с использованием 'echo'. Регулярное выражение будет выглядеть как '^. (. {2})' (начало строки совпадения, любой символ, затем любые два следующих символа). Вы можете просто использовать 'cut -c 2-3', чтобы получить два символа. –

ответ

0

если AWK принимается вами, очень короткий один вкладыш может сделать работу:

kent$ echo "ABCDEFGHIJKLMNOPQRST"|awk 'BEGIN{FS=""}$0=$0$2$3' 
ABCDEFGHIJKLMNOPQRSTBC 
2
TEXT=ABCDEFGHIJKLMNOPQRSTBC 
echo $TEXT${TEXT:1:2} 

Секрет соус Баш описан в Advanced Bash-Scripting Guide, вот его String section.

+1

OP хочет получить ** копию ** символов в позициях 2 - 3 для добавления в конец строки. Таким образом, на самом деле это должно быть '$ TEXT $ {TEXT: 1: 2}'. –

+0

+1 для использования правильной техники. Я отредактировал детали, чтобы соответствовать спецификации. – ams

+0

Кстати, чтобы применить его к файлу, используйте 'while read TEXT; do echo "$ {TEXT} $ {ТЕКСТ: 1: 2}"; done ams

0

Это может работать для вас:

echo "ABCDEFGHIJKLMNOPQRST" | sed 's/.\{1\}\(.\{2\}\).*/&\1/' 
ABCDEFGHIJKLMNOPQRSTBC 

или более просто:

echo "ABCDEFGHIJKLMNOPQRST" | sed 's/.\(..\).*/&\1/' 
ABCDEFGHIJKLMNOPQRSTBC 
Смежные вопросы