Yeah, I ended up using awk, which solved my problem perfectly. I was just curious if I could do that with sed, but it seems too complicated. Thank very much, guys!
Shell Scripting
From Ash, Bash and Csh to Xonsh, Ysh and Zsh; all shell languages are welcome here!
Rules:
- Follow Lemmy rules!
- Posts must relate to shell scripting. (See bottom of sidebar for more information.)
- Only make helpful replies to questions. This is not the place for low effort joke answers.
- No discussion about piracy or hacking.
- If you find a solution to your problem by other means, please take your time to write down the steps you used to solve your problem in the original post. You can potentially help others having the same problem!
- These rules will change as the community grows.
Keep posts about shell scripting! Here are some guidelines to help:
- Allowed: Release Announcement of a command-line program designed for scripted use (e.g. bash, bats, awk, jq, coreutils/moreutils)
- Allowed: Tutorials on using shell languages or supplementary tools designed for scripted use
- Allowed: Code review/help requests for shell languages or supplementary tools designed for scripted use
- NOT Allowed: Announcement of a CLI or TUI program that is not designed for scripted use (Yes, your fancy Zsh plugin which pretty-prints the date and time using only builtins is very cool, but unless you actually want to discuss the code itself, please check out !commandline instead!)
- NOT Allowed: Domain-specific tutorials that do not involve shell scripting as a core component (e.g. docker-compose, ansible, nix). If you really love one of these, I'm sure there's a community out there ready to talk about them!
- NOT Allowed: Code review requests for non-shell programming languages and configuration languages (e.g. Python, Yaml)
In general, if your submission text is primarily shell code, then it is welcome here!
Good call. I have no doubt sed could do it but I do doubt it in would be worth the time to figure it out vs just adding awk in there.
I know you asked about sed, but in case grep is fine, too:
echo theString | grep -f <file with patterns>
Not sure if there's an output which pattern matched.
What result do you need? Do you just nedd to know if one of the regexps matched the string, or do you need to know which one, or is it something else?
IMO if you're doing something that complex you shouldn't be using sed
, but yeah you can probably do this something like:
while read REGEX; do
sed "$REGEX" << EOF
your test string
EOF
done <list_of_regexes.txt
I strongly recommend you don't do that though. It will be absolutely full of quoting bugs. Instead write a script in a proper language to do it. I recommend Deno, or maybe even Rust.
If you use Rust you can also use RegexSet
which will be much faster (if you just want to find matches anyway). Here's what ChatGPT made me. Not tested but it looks vaguely right.
use regex::RegexSet;
use std::fs::File;
use std::io::{self, BufRead};
use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Define the fixed input string
let input_string = "This is a test string for regex matching.";
// Path to the file containing the regexes
let regex_file_path = "regexes.txt";
// Read regexes from the file
let regexes = read_lines(regex_file_path)?
.filter_map(Result::ok) // Filter out errors
.collect::<Vec<String>>();
// Create a RegexSet from the regexes
let regex_set = RegexSet::new(®exes)?;
// Find the regexes that match the input string
let matches: Vec<_> = regex_set.matches(input_string).into_iter().collect();
// Print the matches
if matches.is_empty() {
println!("No regexes matched the input string.");
} else {
println!("Regexes that matched the input string:");
for index in matches {
println!(" - {}", regexes[index]);
}
}
Ok(())
}
// Helper function to read lines from a file
fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
where
P: AsRef<Path>,
{
let file = File::open(filename)?;
Ok(io::BufReader::new(file).lines())
}
Way over engineered.
Both grep and sed take pattern files as input
For sed, the -f flag
-f script-file
--file=script-file
Add the commands contained in the file script-file to the set of commands to be run while processing the input.
For grep, -f
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. If this option is used multiple times or is combined with the -e (--regexp) option, search for all patterns given. The empty file contains zero patterns, and therefore matches nothing. If FILE is - , read patterns from standard input.