Regex

use std::env;
use std::fs;
use std::process;

use anyhow::Result;
use regex::Regex;

fn main() -> Result<()> {
    let args : Vec<String> = env::args().collect();
    let filename = match args.get(1) {
        None => {
            eprintln!("Invalid argument");
            process::exit(1);
        },
        Some(n) => {
            n
        }
    };
    let pattern = args[2].clone();
    let repl = args[3].clone();

    let in_contents = fs::read_to_string(filename)?;
    let re = Regex::new(&pattern)?;

    let out_contents = re.replace_all(&in_contents, &repl).to_string();

    println!("{}", out_contents);

    let pattern = "^([^:]*):";
    let re = Regex::new(pattern)?;

    for line in out_contents.split('\n') {
        let res = match re.captures(line) {
            None => continue,
            Some(v) => v,
        };

        println!("{}", &res[1]);
    }

    Ok(())
}

To test:

cargo r --bin test000 /etc/passwd mycroft testaroo