Как выделить и вывести текст в строке

В C ++ я бы сделал следующее:

#include <fstream>
using namespace std;

int main()
{   
    fstream is("test.txt", std::ios::in);

    char buff;
    vector<char>str;

    while (!is.eof()){is.get(buff);str.push_back(buff);} //read file to string

    for (int a=0;a<str.size();++a)if (str[a] == ' ' && str[a + 1] != ' ')str.erase(str.begin()+a);
    is.close();

    ofstream os("test.txt", std::ios::out | std::ios::trunc); //clear file for rewrite

    os.write(str.data(), str.size() * sizeof(char)); //write chars
    os.close();

    return 0;
    }

Изменил бы содержимое тестового текстового файла на ту же строку, но с удалением пробелов между буквами. (Для точности требуется пробел между каждой буквой).

2
07.01.2017, 13:51
3 ответа

При обнаружении match, grep печатает всю совпавшую строку. Чтобы он печатал только совпадающий текст, вы можете использовать переключатель -o . Но это печатает всю совпавшую строку в строке. Чтобы он напечатал то, что вам нужно, вы должны использовать утверждения просмотра назад и вперед . Для этого требуется grep с поддержкой PCRE.

> grep -Po '(?<=ABCDEF).+(?=K)' <<< 'ABCDEFGHIJKL'
GHIJ

Объяснение:

  • -P Включить регулярное выражение, совместимое с perl
  • -o Печатать только совпадающий текст, а не всю строку
  • (? <= ABCDEF) Положительный вид- за утверждением для сопоставления ABCDEF
  • (? = K) Утверждение положительного упреждающего просмотра для сопоставления K
  • . + Сопоставить все между приведенными выше утверждениями
4
27.01.2020, 21:49

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

Вам понадобится sed .

например.

sed -re 's/^ABCDEF(.*)K.*/\1/'

Здесь используется grep для поиска и замены s / thing, чтобы найти как regexp / thing, чтобы заменить его на /

\ 1 означает замену на 1-е выражение в квадратных скобках.

5
27.01.2020, 21:49

Нет ничего плохого ни в одном из опубликованных решений, но вы можете сделать это на чистом Bash, если хотите.

Дана строка с вашим значением:

echo $myStr 
ABCDEFGHIJKLMNOP

Вы можете сделать:

echo $(expr match "$myStr" '.*F\(.*\)K.*')
GHIJ
2
27.01.2020, 21:49

Теги

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