Очистить поток от stdin, используя node.js - PullRequest
1 голос
/ 08 мая 2019

У меня есть этот скрипт:

let stdin = '';

process.stdin
  .setEncoding('utf8')
  .resume()
  .on('data', d => {

   stdin+= d;
});


const regexs = [
  [/(?=.*[^a-zA-Z])[0-9a-zA-Z]{7,300}/g, function replacer(match, p1, p2, p3, offset, string) {
    return match.slice(0,2) + 'xxxxx' + match.slice(6);
  }]
];


process.stdin.once('end', end => {

  for(let r of regexs){
    stdin = stdin.replace(r[0], r[1]);
  }
  console.log(stdin);
});

, и я использую его так:

 echo "ageoageag ageagoie ag77eage" | node sanitize-stdin.js 

, и я получаю это:

agxxxxxeag agxxxxxie agxxxxxge

но яна самом деле я ищу замену строки длиной 6-300, только если в ней есть числа.Поэтому вывод, который я ищу:

ageoageag ageagoie agxxxxxge

кто-нибудь знает, как заменить строку, только если в ней есть хотя бы один номер?

1 Ответ

1 голос
/ 08 мая 2019

Если ваш скрипт изменен, как насчет этой модификации?

В вашем скрипте match в функции replacer() - это разделенная строка. Когда вводится "ageoageag ageagoie ag77eage", каждое значение ageoageag, ageagoie и ag77eage задается как match. replacer() возвращает все случаи с match как match.slice(0,2) + 'xxxxx' + match.slice(6). При этом agxxxxxeag agxxxxxie agxxxxxge возвращается.

Чтобы обработать только match, включая число, как насчет этой модификации? Пожалуйста, измените функцию replacer() следующим образом.

Из:

return match.slice(0,2) + 'xxxxx' + match.slice(6);

Кому:

return /[0-9]/.test(match) ? match.slice(0,2) + 'xxxxx' + match.slice(6) : match;

Результат:

ageoageag ageagoie agxxxxxge

Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, я прошу прощения.

Edit:

Если введенные значения разделены пробелом, например ageoageag ageagoie ag77eage, как насчет этой модификации? В этой модификации const regexs не используется.

От:

for(let r of regexs){
  stdin = stdin.replace(r[0], r[1]);
}

Кому:

stdin = stdin.split(" ").map(function(e) {
  return e.length > 6 && e.length <= 300 && /[0-9]/.test(e) ? e.slice(0,2) + 'xxxxx' + e.slice(6) : e;
}).join(" ");
...