package main import ( "flag" "fmt" "io" "io/ioutil" "log" "os" "path/filepath" "regexp" ) func main() { // Define the output directory flag. outDir := flag.String("out", ".", "Directory to write output files") flag.Parse() // Determine source of input - either a file or STDIN. var data []byte var err error // If no positional arguments or "-" is provided, read from STDIN. if flag.NArg() < 1 || flag.Arg(0) == "-" { data, err = io.ReadAll(os.Stdin) if err != nil { log.Fatalf("Error reading from STDIN: %v", err) } } else { inputFile := flag.Arg(0) data, err = ioutil.ReadFile(inputFile) if err != nil { log.Fatalf("Error reading file %s: %v", inputFile, err) } } text := string(data) // Regular expression to match each file block. // It matches a line starting with "File:" followed by the file name, // then a divider line with dashes, then captures everything until the next divider. re := regexp.MustCompile(`(?s)File:\s*(.+?)\s*\n-+\n(.*?)(\n-+\n|$)`) matches := re.FindAllStringSubmatch(text, -1) if matches == nil { log.Println("No file entries found in the input.") return } // Ensure the output directory exists if err := os.MkdirAll(*outDir, os.ModePerm); err != nil { log.Fatalf("Error creating output directory %s: %v", *outDir, err) } for _, match := range matches { // match[1] will be the file name, match[2] the file content. fileName := match[1] fileContent := match[2] // Create the full file path using the output directory. fullPath := filepath.Join(*outDir, fileName) // Ensure that the directory for the file exists (in case there's nesting). dir := filepath.Dir(fullPath) if err := os.MkdirAll(dir, os.ModePerm); err != nil { log.Printf("Error creating directory %s: %v", dir, err) continue } if err := ioutil.WriteFile(fullPath, []byte(fileContent), 0644); err != nil { log.Printf("Error writing to file %s: %v", fullPath, err) } else { fmt.Printf("Created file: %s\n", fullPath) } } }