В 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;
}
Изменил бы содержимое тестового текстового файла на ту же строку, но с удалением пробелов между буквами. (Для точности требуется пробел между каждой буквой).
При обнаружении match, grep печатает всю совпавшую строку. Чтобы он печатал только совпадающий текст, вы можете использовать переключатель -o
. Но это печатает всю совпавшую строку в строке. Чтобы он напечатал то, что вам нужно, вы должны использовать утверждения просмотра назад и вперед . Для этого требуется grep с поддержкой PCRE.
> grep -Po '(?<=ABCDEF).+(?=K)' <<< 'ABCDEFGHIJKL'
GHIJ
Объяснение:
-P
Включить регулярное выражение, совместимое с perl -o
Печатать только совпадающий текст, а не всю строку (? <= ABCDEF)
Положительный вид- за утверждением для сопоставления ABCDEF (? = K)
Утверждение положительного упреждающего просмотра для сопоставления K . +
Сопоставить все между приведенными выше утверждениями Я предполагаю, что вы программируете с использованием оболочки, такой как bash
.
Вам понадобится sed
.
например.
sed -re 's/^ABCDEF(.*)K.*/\1/'
Здесь используется grep для поиска и замены s / thing, чтобы найти как regexp / thing, чтобы заменить его на /
\ 1
означает замену на 1-е выражение в квадратных скобках.
Нет ничего плохого ни в одном из опубликованных решений, но вы можете сделать это на чистом Bash, если хотите.
Дана строка с вашим значением:
echo $myStr
ABCDEFGHIJKLMNOP
Вы можете сделать:
echo $(expr match "$myStr" '.*F\(.*\)K.*')
GHIJ