Добавление переменного текста в текстовый файл по строке

У меня есть текстовый файл:

cat test1
ch140/121_------_T_201607061430
ch140/121_------_T_201611070840
ch140/121_------_T_201611071125
ch140/121_------_T_201611071235

Я хочу добавить к этому файлу построчно этот текст:

/121_------_T_201607061430
/121_------_T_201611070840
/121_------_T_201611071125
/121_------_T_201611071235

Результат должен быть:

ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Я использовал:

cat test1 | sed -e 's/ch140//' > test2
for a in $(cat test2)
do
????
done

Какую команду я могу использовать для этого?
Я пробовал использовать команду sed , но это не сработало.

6
задан 24 November 2016 в 08:23

3 ответа

sed 's/\/121.*/&&/' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Объяснение

  • s / old / new / заменить old на new
  • \ / 121. * match / 121 и все, что идет после него
  • && совпавший шаблон два раза

Вы можете добавить tee или использовать перенаправление для сохранения в новый файл

sed 's/\/121.*/&&/' test1 | tee test2
4
ответ дан 23 November 2019 в 07:28

Команда paste делает то же, что и cat , но рядом. -d '' предназначен для paste , чтобы использовать пустой разделитель, поэтому между строками ничего нет.

$ paste -d '' test1 test2 
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Если файлы имеют разную длину, вы можете изучить этот вопрос , чтобы избежать неприглядных результатов.

4
ответ дан 23 November 2019 в 07:28

Вы также можете использовать awk :

$ awk -F'/' -vOFS="/" '{print $0,$2}' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

Здесь я устанавливаю ввод ( -F "/" ) и выходные ( -vOFS = "/" ) разделители полей в / . Это означает, что $ 2 будет всем после первого / и до следующего / . Поскольку в каждой строке только один / , $ 2 - это текст, который вы хотите добавить. Скрипт напечатает каждую строку ( $ 0 ), а затем добавит второе поле ( $ 2 ).

Вы также можете использовать тот же подход в Perl:

$ perl -F"/" -anle 'print "$_/$F[1]"' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

В качестве альтернативы вы можете использовать тот же подход, что и в ответе @ Zanna sed :

$ perl -pe 's#/.*#$&$&#' test1 
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
3
ответ дан 23 November 2019 в 07:28

Другие вопросы по тегам:

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