2013-11-10 2 views
1

Как я могу проверить файл на строку, если автоматически отсутствует строку добавить, например вводакак найти и добавить строку в файл в Linux

входного файла test.txt

  1. это тест текст для целей тестирования
  2. это тест для целей тестирования
  3. это тест для целей тестирования
  4. это тест текст для целей тестирования

Я хотел бы добавить «текст» ко всем строкам

Желаемая Выходные

  1. это тест текст для целей тестирования
  2. это тест текст для целей тестирования
  3. это тестовый текст для целей тестирования
  4. это тестовый текст для целей тестирования

Возможно ли это? большое спасибо заранее

Привет, ребята, спасибо за всю помощь, поскольку мое дело не так просто. Я не буду знать, какая строка будет другой, а в средней строке будет не только одна строка. я дам более четкую случай

входного файла test.txt

  1. Группа: IT_DEPT, VIP Role: Средство просмотра Dept: IT
  2. Группа: IT_DEPT, VIP DEPT: IT
  3. Группа: ФИНАНСЫ КРЕДИТ пРОСМОТРА Роль: Телезритель Dept: ФИНАНСЫ
  4. Группа: ФИНАНСЫ КРЕДИТ пРОСМОТРА Dept: ФИНАНСЫ

Нужные test2 выходного файла.TXT

  1. Группа: IT_DEPT, VIP Роль: Телезритель Отдел: IT
  2. Группа: IT_DEPT, VIP Роль: - Отдел: IT
  3. Группа: ФИНАНСЫ КРЕДИТНЫЙ ПРОСМОТРА Роль: Телезритель Dept: ФИНАНСЫ
  4. Group : ФИНАНСЫ КРЕДИТНЫЙ ПРОСМОТРА Роль: - Отдел: ФИНАНСЫ

Таким образом, те, что не хватает «Роль:» будет добавлена ​​«Роль: -», надеюсь, что это ясно вещи, заранее спасибо еще раз

+5

Это зависит от многого. ['sed 's/test for/test text для/g''] (http://ideone.com/XtsHZa) работает для вашего примера. – jfs

ответ

0

It помогли бы, если бы вы немного упростили вашу проблему: неясно, каковы критерии определения, где должен быть текст «Роль:». Тогда реализация будет заключаться в повторной фразеровке ее в замещение регулярного выражения. Например, если вы хотите всегда иметь «роль» перед вторым «:», то вы могли бы сделать это нравится:

perl -pe 's/^(.*?:.*?)(?:\sRole)?:/$1Role:/' test.txt 

Если вы хотите, чтобы показать, где замена производится с «-», затем немного сложнее выражение будет:

perl -pe 's/^([^:]+:[^:]+)(?<!Role):/$1 Role: -/' 1.txt 

выход:

Group: IT_DEPT,VIP Role: Viewer Dept: IT 
Group: IT_DEPT,VIP Dept Role: - IT 
Group: FINANCE LOAN VIEWER Role: Viewer Dept: FINANCE 
Group: FINANCE LOAN VIEWER Dept Role: - FINANCE 

Это не точный результат, как в вашем примере, но опять же, вам нужно оформить, где именно вы хотите «Роль: -» будет добавлен. Я взял второе место: «как пример.

Точный выход может быть достигнуто способом простого кода:

perl -pe 's/Dept:/Role: - Dept:/ unless /Role:/' 1.txt 

Выход:

Group: IT_DEPT,VIP Role: Viewer Dept: IT 
Group: IT_DEPT,VIP Role: - Dept: IT 
Group: FINANCE LOAN VIEWER Role: Viewer Dept: FINANCE 
Group: FINANCE LOAN VIEWER Role: - Dept: FINANCE 
+0

Можно ли проверить, что строка перед «Dept:» не имеет «Роль:» добавить «Роль: -», но способ, который вы предлагаете, тоже полезен, спасибо – user2951644

+0

Я добавил еще один пример в ответ выше. – glexey

+0

То, что я действительно хотел, это «Роль: -», которая должна быть добавлена ​​до «Департамента:» не «Dept Role: -» – user2951644

0

Не чистейшие, но это будет делать для ваших требований:

#!/bin/bash 

awk '{ 
    for(i = 1; i <= NF; i++) { 
     if ($i == "test" && $(i + 1) != "text") { 
      $i = "test text" 
     } 
    } 
    print $0 
}' input_file > output_file 
0

для текущего примера, это AWK один вкладыш должен работать:

awk '$5!="text"{$5="text "$5}7' file 

испытатель:

kent$ cat f 
this is a test text for testing purpose 
this is a test for testing purpose 
this is a test for testing purpose 
this is a test text for testing purpose 

kent$ awk '$5!="text"{$5="text "$5}7' f 
this is a test text for testing purpose 
this is a test text for testing purpose 
this is a test text for testing purpose 
this is a test text for testing purpose 
+0

Это полезно, но для моего реального случая это не очень удобно. спасибо в любом случае – user2951644

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