[
  {
    "path": ".devcontainer/devcontainer.json",
    "content": "// https://aka.ms/devcontainer.json\n{\n    \"name\": \"txt2regex dev\",\n    \"image\": \"ghcr.io/aureliojargas/devcontainer\",\n    //\n    // https://aka.ms/vscode-remote/containers/non-root\n    \"remoteUser\": \"vscode\",\n    //\n    // https://github.com/devcontainers/features/tree/main/src\n    \"features\": {\n        \"github-cli\": \"latest\",\n        // Some Makefile commands are run inside a Docker container\n        \"docker-in-docker\": \"latest\"\n    }\n}\n"
  },
  {
    "path": ".github/workflows/check.yml",
    "content": "# https://docs.github.com/en/actions/reference\n\nname: Check\non:\n  push:\n  pull_request:\njobs:\n\n  lint:\n    runs-on: ubuntu-22.04\n    steps:\n      - uses: actions/checkout@v2\n      - run: sudo snap install shfmt\n      - run: make lint\n\n  test:\n    runs-on: ubuntu-22.04\n    steps:\n      - uses: actions/checkout@v2\n      # See https://github.com/aureliojargas/txt2regex/pull/9 on why we're\n      # using env in the next command\n      - run: env --default-signal=PIPE make test\n      - run: make test-bash\n      - run: make test-regex\n\n      - name: The repository must remain unchanged after the checks\n        run: |\n          git diff\n          git diff-index --exit-code HEAD\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog for txt2regex\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog].\n\n[Keep a Changelog]: https://keepachangelog.com/en/1.0.0/\n\n[Unreleased]: https://github.com/aureliojargas/txt2regex/compare/v0.9...HEAD\n[Version 0.9]: https://github.com/aureliojargas/txt2regex/releases/tag/v0.9\n[Version 0.8]: https://github.com/aureliojargas/txt2regex/releases/tag/v0.8\n[Version 0.7]: https://github.com/aureliojargas/txt2regex/releases/tag/v0.7\n[Version 0.6]: https://github.com/aureliojargas/txt2regex/releases/tag/v0.6\n[Version 0.5]: https://github.com/aureliojargas/txt2regex/releases/tag/v0.5\n[Version 0.4]: https://github.com/aureliojargas/txt2regex/releases/tag/v0.4\n[Version 0.3.1]: https://github.com/aureliojargas/txt2regex/releases/tag/v0.3.1\n[Version 0.3]: https://github.com/aureliojargas/txt2regex/releases/tag/v0.3\n[Version 0.2]: https://github.com/aureliojargas/txt2regex/releases/tag/v0.2\n[Version 0.1]: https://github.com/aureliojargas/txt2regex/releases/tag/v0.1\n\n[#12]: https://github.com/aureliojargas/txt2regex/pull/12\n[#9]: https://github.com/aureliojargas/txt2regex/pull/9\n[#7]: https://github.com/aureliojargas/txt2regex/pull/7\n[#6]: https://github.com/aureliojargas/txt2regex/pull/6\n[#5]: https://github.com/aureliojargas/txt2regex/pull/5\n[#3]: https://github.com/aureliojargas/txt2regex/pull/3\n\n[307ae9a]: https://github.com/aureliojargas/txt2regex/commit/307ae9a\n[d0c6254]: https://github.com/aureliojargas/txt2regex/commit/d0c6254\n[bee846a]: https://github.com/aureliojargas/txt2regex/commit/bee846a\n[dbcd055]: https://github.com/aureliojargas/txt2regex/commit/dbcd055\n[f1d80c9]: https://github.com/aureliojargas/txt2regex/commit/f1d80c9\n[0a7127a]: https://github.com/aureliojargas/txt2regex/commit/0a7127a\n[1660d83]: https://github.com/aureliojargas/txt2regex/commit/1660d83\n[61abe24]: https://github.com/aureliojargas/txt2regex/commit/61abe24\n[3a3fd24]: https://github.com/aureliojargas/txt2regex/commit/3a3fd24\n[8e1f6ea]: https://github.com/aureliojargas/txt2regex/commit/8e1f6ea\n[4b98e2b]: https://github.com/aureliojargas/txt2regex/commit/4b98e2b\n[f5d0125]: https://github.com/aureliojargas/txt2regex/commit/f5d0125\n[d7850d2]: https://github.com/aureliojargas/txt2regex/commit/d7850d2\n[f323926]: https://github.com/aureliojargas/txt2regex/commit/f323926\n[190906c]: https://github.com/aureliojargas/txt2regex/commit/190906c\n[2768584]: https://github.com/aureliojargas/txt2regex/commit/2768584\n[4b41298]: https://github.com/aureliojargas/txt2regex/commit/4b41298\n[7a1b0cb]: https://github.com/aureliojargas/txt2regex/commit/7a1b0cb\n[674d7bb]: https://github.com/aureliojargas/txt2regex/commit/674d7bb\n[bee220c]: https://github.com/aureliojargas/txt2regex/commit/bee220c\n[a3f7fef]: https://github.com/aureliojargas/txt2regex/commit/a3f7fef\n[c084ed8]: https://github.com/aureliojargas/txt2regex/commit/c084ed8\n\n\n## [Unreleased]\n\n### Added\n\n- CI: Now also run the tests for Bash version 5.1 [307ae9a]\n\n### Changed\n\n- CI: Moved from Travis CI to GitHub Actions [#9]\n\n### Fixed\n\n- Fixed to work properly in Bash 5.2 (thanks Nick Rosbrook) [#12]\n\n\n## [Version 0.9] released in 2020-05-21\n\n### Added\n\n- Added CHICKEN Scheme regexes (thanks Mario Domenech Goulart)\n  [dbcd055], [f1d80c9]\n- New tests for all the command line options (`tests/cmdline.md`)\n- New tests for txt2regex features (`tests/features.md`) [#5]\n- New regex tester that runs the supported programs in a Docker\n  container. Using specially crafted regexes, it verifies how the\n  programs behave in \"real life\". This avoids manual testing or reading\n  the program documentation to get regex-related information\n  (`tests/regex-tester.sh`) [#6]\n- New automatic testing in all Bash versions from 3.0 to 5.0, to make\n  sure txt2regex works in all of them (`make test-bash`)\n- Now using Travis CI to run all the tests at every push to the GitHub\n  repository\n- New Makefile targets to perform common tasks: `check`, `fmt`,\n  `install-bin`, `install-mo`, `lint`, `test`, `test-bash`,\n  `test-regex`, `test-regex-build`, `test-regex-shell`\n- Added short options `-h` (for `--help`) and `-V` (for `--version`)\n  [0a7127a], [1660d83]\n\n### Removed\n\n- Removed Lisp regexes (choose Emacs and/or CHICKEN Scheme instead)\n- Removed OpenOffice.org regexes (not supported by the new regex tester)\n- Removed VBScript regexes (not supported by the new regex tester)\n- Removed the old regex tester `test-suite/*`\n- Removed `tools/bashdump-rmdup.sh` since `msguniq` has the same\n  functionality\n- Removed the NEWS file for not adding too much value over the changelog\n\n### Changed\n\n- Bumped minimal required Bash version from 2.04 to 3.0 [d0c6254]\n- Bumped the versions for all the supported programs [#7]\n- Validated and updated the regex data for all the supported programs,\n  thanks to the new regex tester. Some programs now support new\n  metacharacters, while others got updates on the escaping rules and\n  POSIX character classes support [#7]\n- JavaScript regexes: now using Node.js instead of Netscape [61abe24]\n- lex regexes: now using GNU flex [3a3fd24]\n- PHP regexes: switch from old `ereg` to `preg` (PCRE) [8e1f6ea]\n- Changed the default programs: +egrep +grep +emacs -perl -php -postgres\n- Remove repeated characters inside a list `[]` (if the user has typed\n  `abbbca`, make it `[abc]`) [4b98e2b]\n- Now `--showmeta` also shows the version for each program [d7850d2]\n- Now the \"!! not supported\" legend only appears when there are\n  unsupported metacharacters in the current regex [f323926]\n- Converted everything (code, docs, translations) to UTF-8\n- Improved the source code quality (`shellcheck`) and formatting\n  (`shfmt`)\n- Unset `$PATH` in the top of the script to make sure only Bash builtin\n  commands are used [bee846a]\n- Simplified the man page contents [f5d0125]\n- i18n: Improve some translatable strings to make them shorter and\n  easier to translate\n- Moved the project hosting from SourceForge to GitHub\n- Converted this changelog to the [Keep a Changelog] format\n\n### Fixed\n\n- Fixed to work properly in bash5 (thanks Yanmarshus Bachtiar) [190906c]\n- Fixed `eval` bug when running in bash3 or newer (thanks Marcus\n  Habermehl) [2768584]\n- Fixed incorrect metacharacters for `?` and `+` showing up for `vi` in\n  `--showmeta` and `--showinfo` [c084ed8]\n- Fixed the escaping of the `}` character to be matched as a literal\n- Fixed the escaping of the `\\` character to be matched as a literal,\n  for programs that use `\\\\` for escaping: before: `\\\\\\`, now: `\\\\\\\\`\n  [4b41298]\n- Fixed the escaping of the `\\` character when inside a list `[]`\n  [a3f7fef]\n- Fixed the handling of the `[` character when inside a list `[]`: it is\n  not special at all and should not be handled [7a1b0cb]\n- Fixed the handling of the `^` character when inside a list `[]`: only\n  move it to the end when it is in the first position [674d7bb]\n- Fixed the handling of the `-` character when inside a list `[]`: do\n  not move it to the end when it is in the first position, since it is\n  not special there [bee220c]\n\n### Translations\n\n- Added Turkish translations provided by erayalakese [#3]\n- Added Catalan translations provided by Carles (ChAoS)\n- Added French translations provided by wwp\n\n## [Version 0.8] released in 2004-09-28\n\n### Added\n\n- Added OpenOffice.org regexes support\n\n### Changed\n\n- Documentation updated: cleaner README and new man page contents\n\n### Fixed\n\n- Fixed bash version test, now works on bash 3.0 and newer (thanks Rene\n  Engelhard)\n- Fixed sed script bug on `procmail-re-test` (thanks JulioB @ caltech)\n\n### Translations\n\n- Added Romanian translations provided by Robert Claudiu Gheorghe\n- Added Spanish translations provided by Diego Moya Velázquez\n- Added Italian translations provided by Daniele Pizzolli and\n  revised by Marco Pagnanini\n\n## [Version 0.7] released in 2002-03-04\n\n### Added\n\n- Groups are now quantifiable, i.e. `(foo|bar){1,5}`\n- New option `--prog` to choose which programs to show the regexes for\n- New option `--make` to automatically compose regexes for common\n  patterns: date, hour, number\n- New option `--version` to show the txt2regex version\n- Added the \"Really quit?\" confirmation (thanks Martin Butterwecki)\n- Added man page (thanks Martin Butterwecki)\n\n### Fixed\n\n- Fixed Makefile bug on `DESTDIR` (thanks Martin Butterwecki)\n\n### Translations\n\n- Added Japanese translations provided by Hajime Dei\n\n## [Version 0.6] released in 2001-09-05\n\n- Added (group|and|alternation) support\n- Added groups balance check -> `(((3)))`\n- Added MySQL regexes support\n- Option `--history` now supports all the txt2regex features\n- Added German translations provided by Jan Parthey\n\n## [Version 0.5] released in 2001-08-28\n\n- New option `--showmeta` to print a complete metacharacters table\n- New option `--showinfo` to print regex-related information about a\n  program\n\n## [Version 0.4] released in 2001-08-02\n\n- Added JavaScript regexes support\n- Added PostgreSQL regexes support\n- Added procmail regexes support\n- Added VBScript regexes support\n- New `procmail-re-test` utility to test the procmail regexes from the\n  command line\n- Test-suite improved and now included on the tarball\n- Updated Polish translations\n\n## [Version 0.3.1] released in 2001-06-26\n\n- Now using a custom `sek()` function instead of the `seq` command, thus\n  removing the last external (non-bash-builtin) command from txt2regex\n- Updated Indonesian translation\n- Updated Polish translation\n\n## [Version 0.3] released in 2001-06-13\n\n- Added support for localized POSIX character classes `[[:abc:]]`\n- Added support for special user combinations inside lists `[]`\n- New option `--whitebg` to adjust the colors for white background\n  terminals\n- Improve the final human sentence with more detailed data\n- Remove the usage of the `clear` and `stty` commands, because they are\n  not Bash builtin commands (and txt2regex strives to be 100% Bash\n  builtins powered)\n- The project is now hosted at SourceForge\n- Added Polish translations provided by Chris Piechowicz\n\n## [Version 0.2] released in 2001-04-24\n\n- Changed project name from txt2regexp to txt2regex\n- New option `--history` to \"replay\" from history data a regex\n  previously composed in txt2regex\n- New option `--nocolor` to not use colors in the interface\n- New dynamic history for user input:\n  `.oO(history)(¤user_input1¤userinput2¤...)`\n- Added Indonesian (Bahasa) translations provided by Muhamad Faizal\n\n## [Version 0.1] released in 2001-02-23\n\n- Initial release (as txt2regexp)\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to txt2regex\n\nPlease follow the usual GitHub workflow to contribute to this project:\n\n- Use [GitHub issues](https://github.com/aureliojargas/txt2regex/issues) for bug reports and feature requests.\n\n- Use GitHub pull requests to submit code and translations.\n\n## Guidelines\n\nThe following guidelines are reminders for the future me (the author), because I cannot hold all of that information in my head. You, as a contributor, are not required to follow them (but thanks if you do).\n\n- Keep the current code style (even if you find it odd)\n\n- Keep the code formatted (`make fmt`) and validated (`make lint`)\n\n- Do not use any system command, this is a Bash builtins script\n\n- Do not use any Bash feature that is not supported by the old minimal version txt2regex supports (see https://mywiki.wooledge.org/BashFAQ/061)\n\n- Do not use `echo`, use `printf`\n\n- Always use `[` instead of `test` in `txt2regex.sh`\n\n- Use `-eq` and `-ne` instead of `==` and `!=` for numeric tests\n\n- Use `-n` and `-z` when testing variables for emptiness\n\n- Always use `$\"...\"` for strings that the user will see (i18n)\n\n- Think about translations, keep strings short and direct\n\n- Update the man page when there are relevant changes\n\n- Update the Changelog when there are relevant changes\n\n- New files should always be UTF-8\n\n## Testing\n\nAll tests must always be successful. The CI will refuse changes that break tests.\n\n- Add/update tests in `tests/*.md` when adding/updating features\n\n- Make sure all the tests are passing: `make test`\n\n- Make sure it's working in all the supported Bash versions: `make test-bash`\n\n- When touching the regex tester, run it (`make test-regex`) and check the `regex-tester.txt` contents for changes\n\n- Do some manual testing to make sure the interactive usage is ok\n\n## Releasing\n\n- Make sure all the tests are passing (see previous topic)\n\n- Make sure the manual page contents is up-to-date with the current code and regenerate it with `make doc`\n\n- Make sure the Changelog is up-to-date, containing all the relevant changes since the last released version\n\n- In the `TODO` file, is there anything to be added/removed?\n\n- In the `README.md` file, is there anything to be added/removed?\n\n- Update the `po/*.{po,pot}` files to match the current code: run `make po` and commit\n\n- Create the official release commit:\n\n  - Update the version number in `txt2regex.sh` and `Makefile`\n  - Update the version number in `tests/cmdline.md`\n  - Update the version number and creation date in the potfile: `make pot`\n  - Update the man page date to the release date and regenerate it: `make doc`\n  - Update the changelog with the version number and release date\n    - Remember to update the \"compare\" links at the top\n  - Rerun the tests, just in case: `make check`\n  - Commit\n  - Tag this commit with the version number\n  - Example: https://github.com/aureliojargas/txt2regex/commit/be3e0fa\n\n- Publish the release: `git push && git push --tags`\n\n- Get back to the development version:\n  - Update the version number in `txt2regex.sh` and `Makefile`\n    - Use `version+1` and add the `b` suffix (for beta)\n  - Example: https://github.com/aureliojargas/txt2regex/commit/193c011\n\n## History rewrite\n\nIn 2020-05-19 the whole Git history for this repository was rewritten. It was necessary to set the correct date for the initial commits, so they reflect the official release date for the releases.\n\nBefore:\n\n    699db55 2012-12-21  adding txt2regex version 0.1 (2001-02-23)\n    fb48115 2012-12-21  Revert \"adding txt2regex version 0.1 (2001-02-23)\"\n    1a45c22 2012-12-21  add txt2regex version 0.1 (2001-02-23)\n    961f8fa 2012-12-21  Program renamed from txt2regexp to txt2regex\n    f4ac6e7 2012-12-21  Add txt2regex version 0.2 (2001-04-24)\n    4c037d1 2012-12-21  Renamed file: id.po => id_ID.po\n    7c4de30 2012-12-21  Add txt2regex version 0.3 (2001-06-13)\n    5d56afd 2012-12-21  Add txt2regex version 0.3.1 (2001-06-26)\n    92c7677 2012-12-21  Add txt2regex version 0.4 (2001-08-02)\n    cd23c57 2012-12-21  Add txt2regex version 0.5 (2001-08-28)\n    4b572b5 2012-12-21  Add txt2regex version 0.6 (2001-09-05)\n    20ac0f5 2012-12-21  Add txt2regex version 0.7 (2002-03-04)\n    6fe0ae8 2012-12-21  Add txt2regex version 0.8 (2004-09-28)\n    3bbfa3b 2012-12-21  Add txt2regex version 0.9 beta (unreleased)\n\nAfter:\n\n    f17f458 2001-02-22  Initial commit\n    2f066eb 2001-02-22  Remove empty README\n    eff18e0 2001-02-23  Add txt2regex version 0.1 (2001-02-23)\n    5f685c5 2001-04-24  Program renamed from txt2regexp to txt2regex\n    da3e729 2001-04-24  Add txt2regex version 0.2 (2001-04-24)\n    db8a71e 2001-06-13  Renamed file: id.po => id_ID.po\n    6fa7545 2001-06-13  Add txt2regex version 0.3 (2001-06-13)\n    98c60e8 2001-06-26  Add txt2regex version 0.3.1 (2001-06-26)\n    f2acfd3 2001-08-02  Add txt2regex version 0.4 (2001-08-02)\n    bdd05d1 2001-08-28  Add txt2regex version 0.5 (2001-08-28)\n    7e9159f 2001-09-05  Add txt2regex version 0.6 (2001-09-05)\n    b8b618a 2002-03-04  Add txt2regex version 0.7 (2002-03-04)\n    8d96c9a 2004-09-28  Add txt2regex version 0.8 (2004-09-28)\n    2768584 2012-12-21  Add txt2regex version 0.9 beta (unreleased)\n\nNote that the initial commit was also fixed, instead of the old weird revert.\n\nAll of the existing Git tags (`v0.1`, `v0.2`, ...) were updated to point to the new commits.\n\nAnother change in this rewrite was the removal (not the revert) of the commit that added the `releases/` folder with all the `.tgz` files from all the releases (until v0.8):\n\n    2a113fe 2013-09-22  Add new 'releases' folder with TGZ files\n\nThat was a bad idea. GitHub already provides automatic `.zip` and `.tar.gz` files for every tagged commit. Since all of those first commits were created by expanding the tarballs from the official releases, the GitHub ones should be equal.\n\nThe old `master` branch was saved as the `master-until-2020-05-19` branch.\n\nAll the pull requests until number 7 are now referencing not the `master` commits, but those in the `master-until-2020-05-19` branch.\n\nI know this is a total mess. I'm sorry for that. But I think having the official dates for the commits of the old versions is important. Now the \"Releases\" listing in GitHub has the correct dates.\n"
  },
  {
    "path": "COPYRIGHT",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "Makefile",
    "content": "NAME = txt2regex\nVERSION = 0.10b\nBASHVERSIONS = 3.0 3.1 3.2 4.0 4.1 4.2 4.3 4.4 5.0 5.1\nREGEXTESTERIMAGE = aureliojargas/regex-tester:2020-05-09\n\nSCRIPT = $(NAME).sh\nPODIR = po\nPOTFILE = $(PODIR)/$(NAME).pot\n\nDESTDIR =\nBINDIR = $(DESTDIR)/usr/bin\nLOCALEDIR = $(DESTDIR)/usr/share/locale\nMANDIR = $(DESTDIR)/usr/share/man/man1\n\n.PHONY: check check-po clean doc fmt install install-bin \\\n        install-mo lint mo po pot test test-bash test-regex \\\n        test-regex-build test-regex-shell\n\n#-----------------------------------------------------------------------\n# Dev\n\ncheck: lint test\n\nfmt:\n\tshfmt -w -i 4 -ci -sr $(SCRIPT) tests/regex-tester.sh\n\nlint:\n\tshellcheck $(SCRIPT) tests/regex-tester.sh\n\tshfmt -d -i 4 -ci -sr $(SCRIPT) tests/regex-tester.sh\n\ntest: clitest.sh\n\tsh clitest.sh --progress none README.md tests/*.md\n\n# Run the tests in multiple Bash versions, using the official Docker\n# image https://hub.docker.com/_/bash (each image is ~10MB).\n# Early exit the loop in the first error, otherwise only the last loop\n# iteration would count as the exit state for this target.\ntest-bash: clitest.sh\n\t@for v in $(BASHVERSIONS); do \\\n\t\tprintf '\\nTesting in Bash version %s\\n' $$v; \\\n\t\tdocker run --rm -v $$PWD:/code -w /code bash:$$v \\\n\t\t\tsh clitest.sh --progress none tests/*.md || exit 1; \\\n\tdone\n\n# Run regex tests for the supported programs, inside a Docker container\ntest-regex:\n\t# Explicit pull to make sure all the log messages from the pulling\n\t# process appear here, and not when executing the next \"docker run\",\n\t# whose output goes directly to the .txt file.\n\tdocker image inspect $(REGEXTESTERIMAGE) >/dev/null 2>&1 || \\\n\tdocker pull $(REGEXTESTERIMAGE)\n\n\t# Test all programs except \"vi\"\n\tdocker run --rm -v \"$$PWD\":/code -w /code $(REGEXTESTERIMAGE) \\\n\t\ttests/regex-tester.sh --skip vi > tests/regex-tester.txt 2>&1\n\n\t# vi: no stderr redirect to avoid \"inappropriate ioctl for device\"\n\t# vi: docker run -t adds a trailing \\r to every line :/\n\tdocker run --rm -v \"$$PWD\":/code -w /code -t $(REGEXTESTERIMAGE) \\\n\t\ttests/regex-tester.sh vi | tr -d '\\r' >> tests/regex-tester.txt\n\ntest-regex-shell:\n\tdocker run --rm -v \"$$PWD\":/code -w /code -it $(REGEXTESTERIMAGE)\n\ntest-regex-build:\n\tdocker build -t $(REGEXTESTERIMAGE) tests/\n\nclean:\n\trm -f $(NAME) clitest.sh txt2tags.py messages.mo tmp.lex.*\n\trm -f $(PODIR)/messages $(PODIR)/*.mo $(PODIR)/*.tmp $(PODIR)/*~\n\trm -rf $(PODIR)/??/ $(PODIR)/??_??/\n\ndoc: txt2tags.py\n\tpython3 ./txt2tags.py -t man  man/txt2regex.t2t\n\tpython3 ./txt2tags.py -t html man/txt2regex.t2t\n\nclitest.sh:\n\tcurl -s -L -o $@ \\\n\thttps://raw.githubusercontent.com/aureliojargas/clitest/master/clitest\n\ntxt2tags.py:\n\tcurl -s -L -o $@ \\\n\thttps://raw.githubusercontent.com/aureliojargas/txt2tags/3.4/txt2tags.py\n\n#-----------------------------------------------------------------------\n# Translation files\n#\n# Learn more: http://pology.nedohodnik.net/doc/user/en_US/ch-poformat.html\n# Example potfile: http://git.savannah.gnu.org/cgit/gawk.git/tree/po/gawk.pot\n\npot:\n\t@date=`date '+%Y-%m-%d %H:%M %Z'`; \\\n\t( \\\n\t\tprintf '%s\\n' '#, fuzzy'; \\\n\t\tprintf '%s\\n' 'msgid \"\"'; \\\n\t\tprintf '%s\\n' 'msgstr \"\"'; \\\n\t\tprintf '\"%s\"\\n' 'Project-Id-Version: $(NAME) $(VERSION)\\n'; \\\n\t\tprintf '\"%s\"\\n' \"POT-Creation-Date: $$date\\n\"; \\\n\t\tprintf '\"%s\"\\n' 'PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n'; \\\n\t\tprintf '\"%s\"\\n' 'Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n'; \\\n\t\tprintf '\"%s\"\\n' 'MIME-Version: 1.0\\n'; \\\n\t\tprintf '\"%s\"\\n' 'Content-Type: text/plain; charset=UTF-8\\n'; \\\n\t\tprintf '\"%s\"\\n' 'Content-Transfer-Encoding: 8bit\\n'; \\\n\t\tbash --dump-po-strings $(SCRIPT); \\\n\t) | msguniq --no-wrap --sort-by-file -o $(POTFILE); \\\n\tprintf '%s was generated\\n' $(POTFILE)\n\npo: pot\n\t@for pofile in $(PODIR)/*.po; do \\\n\t\tprintf 'Merging %s...' $$pofile; \\\n\t\tmsgmerge --update --sort-by-file --no-wrap --previous \\\n\t\t\t$$pofile $(POTFILE); \\\n\tdone; \\\n\tprintf 'Remember to grep for the fuzzy messages in all .po files\\n'\n\nmo:\n\t@for pofile in $(PODIR)/*.po; do \\\n\t\tprintf 'Compiling %s... ' $$pofile; \\\n\t\tmsgfmt -o $${pofile%.po}.mo $$pofile && \\\n\t\techo ok; \\\n\tdone\n\ncheck-po:\n\t@for pofile in $(PODIR)/*.po; do \\\n\t\tprintf 'Checking %s...' $$pofile; \\\n\t\tmsgfmt --verbose $$pofile || exit 1; \\\n\tdone\n\n#-----------------------------------------------------------------------\n# Release\n\ninstall: install-mo install-bin\n\ninstall-mo: mo\n\ttest -d $(LOCALEDIR) || mkdir -p $(LOCALEDIR); \\\n\tfor mofile in $(PODIR)/*.mo; do \\\n\t\tmoinstalldir=$(LOCALEDIR)/`basename $$mofile .mo`/LC_MESSAGES; \\\n\t\ttest -d $$moinstalldir || mkdir -p $$moinstalldir; \\\n\t\tinstall -m644 $$mofile $$moinstalldir/$(NAME).mo; \\\n\tdone\n\ninstall-bin:\n\ttest -d $(BINDIR) || mkdir -p $(BINDIR); \\\n\tsed -e '/^TEXTDOMAINDIR=/s,=.*,=$(LOCALEDIR),' \\\n\t\t$(SCRIPT) > $(BINDIR)/$(NAME) && \\\n\tchmod +x $(BINDIR)/$(NAME) && \\\n\tprintf '\\nProgram \"%s\" installed. Just run %s\\n' \\\n\t\t$(NAME) $(BINDIR)/$(NAME)\n"
  },
  {
    "path": "README.md",
    "content": "## txt2regex — Regular expression wizard for the command line\n\n![](https://aurelio.net/projects/txt2regex/img/demo.gif)\n\n- Author: [Aurelio Jargas](https://aurelio.net/about.html)\n- License: GPLv2\n- First release: 2001-02-23 ([all releases](https://github.com/aureliojargas/txt2regex/releases))\n- Requires: Bash >= 3.0\n- Website: https://aurelio.net/projects/txt2regex/\n\nTxt2regex is a regular expression wizard for the command line.\n\nUsers with little or no knowledge of regular expressions can quickly\ncreate hairy regexes by answering questions in a simple text-based\ninteractive interface.\n\nTxt2regex is aware of the particular notation and caveats of many\ndifferent regular expression flavors, generating valid regexes for more\nthan 20 targets, including grep, sed, Vim, Emacs, JavaScript, Python,\nPHP, PostgreSQL.\n\nTxt2regex is a one-file shell script made 100% with Bash builtin\ncommands. The only requirement is Bash itself, since no grep, find, sed\nor any other system command is used.\n\n\n## Command line options\n\nSee [tests/cmdline.md](tests/cmdline.md) for a list of all the\navailable command line options and examples on using them.\n\n\n## Features\n\nSee [tests/features.md](tests/features.md) for some of the special\nfeatures txt2regex has to handle user input and compose proper regexes.\n\n\n## Running\n\nTxt2regex is a stand-alone Bash script, it doesn't need to be installed.\nJust run it:\n\n    bash txt2regex.sh\n\nMaking it an executable file, you can run it directly:\n\n    chmod +x txt2regex.sh\n    ./txt2regex.sh\n\nIf you want it in [another language][pos] besides English:\n\n    make install BINDIR=. LOCALEDIR=po\n    LANG=es_ES ./txt2regex\n\n\n## Supported flavors\n\n```console\n$ bash txt2regex.sh --showmeta\n\nawk             +      ?             |      ()    awk version 20121220\nchicken         +      ?     {}      |      ()    CHICKEN 4.12.0\ned             \\+     \\?   \\{\\}     \\|    \\(\\)    GNU Ed 1.10\negrep           +      ?     {}      |      ()    grep (GNU grep) 3.1\nemacs           +      ? \\\\{\\\\}    \\\\|  \\\\(\\\\)    GNU Emacs 25.2.2\nexpect          +      ?     {}      |      ()    expect version 5.45.4\nfind            +      ?     {}      |      ()    find (GNU findutils) 4.7.0-git\ngawk            +      ?     {}      |      ()    GNU Awk 4.1.4\ngrep           \\+     \\?   \\{\\}     \\|    \\(\\)    grep (GNU grep) 3.1\njavascript      +      ?     {}      |      ()    node v8.10.0\nlex             +      ?     {}      |      ()    flex 2.6.4\nmawk            +      ?             |      ()    mawk 1.3.3 Nov 1996\nmysql           +      ?     {}      |      ()    mysql  Ver 14.14 Distrib 5.7.29\nperl            +      ?     {}      |      ()    perl v5.26.1\nphp             +      ?     {}      |      ()    PHP 7.2.24-0ubuntu0.18.04.4\npostgres        +      ?     {}      |      ()    psql (PostgreSQL) 10.12\nprocmail        +      ?             |      ()    procmail v3.23pre 2001/09/13\npython          +      ?     {}      |      ()    Python 3.6.9\nsed            \\+     \\?   \\{\\}     \\|    \\(\\)    sed (GNU sed) 4.4\ntcl             +      ?     {}      |      ()    tcl 8.6\nvi                         \\{\\}           \\(\\)    nvi 1.81.6-13\nvim            \\+     \\=    \\{}     \\|    \\(\\)    VIM - Vi IMproved 8.0 (2016 Sep 12)\n\nNOTE: . [] [^] and * are the same on all programs.\n\n$\n```\n\n\n## Regex tester to gather \"real life\" data\n\nTxt2regex needs to know regex-related information for each flavor it\nsupports. For example:\n\n- Which metacharacters are supported?\n- How to escape a metacharacter to match it literally?\n- Are POSIX character classes supported?\n\nInstead of relying in documentation to get that information, the\n[tests/regex-tester.sh](tests/regex-tester.sh) script calls the real\nprograms with specially crafted regexes and sample texts, verifying how\nthose programs behave in \"real life\".\n\nTo have a trackable and public record, the output of this tester is also\nsaved to this repository, in a readable and grepable plain text file:\n[tests/regex-tester.txt](tests/regex-tester.txt). Future changes in\nbehavior can be easily detected.\n\n\n## Testing\n\n- `make test` — to run all the tests in the current Bash version on your\n  machine.\n\n- `make test-bash` — to run all the tests in all the released Bash\n  versions since 3.0 (requires Docker).\n\n- `make test-regex` — to run the regex tester (requires Docker).\n\nCheck the [Makefile](Makefile) for the details on what gets executed.\n\n\n## Translators\n\n    ca       Catalan       Carles (ChAoS)\n    de_DE    German        Jan Parthey\n    es_ES    Spanish       Diego Moya\n    fr_FR    French        wwp\n    id_ID    Indonesian    Muhamad Faizal\n    it_IT    Italian       Daniele Pizzolli\n    ja       Japanese      Hajime Dei\n    pl_PL    Polish        Chris Piechowicz\n    pt_BR    Portuguese    Aurelio Jargas\n    ro_RO    Romanian      Robert Claudiu Gheorghe\n    tr       Turkish       erayalakese\n\nTo translate txt2regex to your language:\n\n- translate the [po/txt2regex.pot][potfile] file (in the `msgstr` lines)\n- save it as `po/XX.po` (where XX is the [two-letter code][iso639] for\n  your language)\n- submit this new `.po` file in a pull request\n\nCheck the [current translations][pos] for reference.\n\n[potfile]: https://github.com/aureliojargas/txt2regex/blob/master/po/txt2regex.pot\n[iso639]: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\n[pos]: https://github.com/aureliojargas/txt2regex/tree/master/po\n\n\n## FAQ\n\n### Why?\n\n- To try to make simple regexes less painful for beginners.\n- To have a reliable source for the specific regex syntax and rules from\n  different flavors.\n- To have coding fun :)\n\n### What is that `<TAB>` that appears in the regex?\n\nThat `<TAB>` represents a literal tab character. When using the regex in\nthe desired external program, remember to change that to a literal tab.\nThis is required by programs that do not support using `\\t` as a\nshortcut for the tab character.\n\n### Why my terminal size (lines/columns) is not detected?\n\nTxt2regex uses the environment variables `$LINES` and `$COLUMNS` to get\nthe current terminal size. Make sure you have them exported, otherwise\nthe default 80x25 size will be assumed.\n\nTo check if the variables are exported, run:\n\n```bash\nbash -c 'echo $COLUMNS $LINES'\n```\n\nIf no numbers are shown in the output, a quick fix is running:\n\n```bash\nexport COLUMNS LINES\n```\n\nAs a permanent fix, add the previous `export` command to a Bash\nconfiguration file, such as `~/.bashrc`.\n"
  },
  {
    "path": "TODO",
    "content": "txt2regex TODO:\n\n  - new programs: expr, oawk, nawk, MKS awk, ruby, bash, java, html5, lua\n  - add support for \\<borders\\>\n  - support for user defined ranges as 0-5, a-f, etc\n  - allow combinations as [A-Z0-9_.#]\n  - more ready-to-use regexes! (ip, email, url)\n  - ~/.txt2regexrc: remember programs, last histories, name REs\n  - negated POSIX|special combination (Choice hack)\n  - empty | check, for things like ^| or (|)\n  - how to capture blanks on Get* (via menu)?\n\nUser requests:\n\n  - undo last step (Bence Fejervari @ .hu)\n  - std{in,out} mode to use it with a frontend (Robert-Claudiu Gheorghe @ .com)\n  - interface to feed the programs with the RegEx (Chris Piechowicz @ .au)\n  - on the fly regex test (zentara @ .com)\n  - add other versions of the same program (julioB @ .edu)\n  - escape special chars when **applying** the regex (julioB @ .edu)\n\nExtra TODO:\n\n  - grep TODO txt2regex.sh\n"
  },
  {
    "path": "man/txt2regex.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<title>TXT2REGEX</title>\n<meta name=\"generator\" content=\"http://txt2tags.org\">\n<style>\nbody{background-color:#fff;color:#000;}\nhr{background-color:#000;border:0;color:#000;}\nhr.heavy{height:5px;}\nhr.light{height:1px;}\nimg{border:0;display:block;}\nimg.right{margin:0 0 0 auto;}\nimg.center{border:0;margin:0 auto;}\ntable th,table td{padding:4px;}\n.center,header{text-align:center;}\ntable.center {margin-left:auto; margin-right:auto;}\n.right{text-align:right;}\n.left{text-align:left;}\n.tableborder,.tableborder td,.tableborder th{border:1px solid #000;}\n.underline{text-decoration:underline;}\n</style>\n</head>\n<body>\n<header>\n<hgroup>\n<h1>TXT2REGEX</h1>\n<h3>May 21, 2020</h3>\n</hgroup>\n</header>\n<article>\n\n<div class=\"body\" id=\"body\">\n\n<section>\n<h1>NAME</h1>\n\n<p>\n<strong>txt2regex</strong> -- console regular expression wizard\n</p>\n\n</section>\n<section>\n<h1>SYNOPSIS</h1>\n\n<p>\n<strong>txt2regex</strong> [<strong>--nocolor</strong>|<strong>--whitebg</strong>] [<strong>--all</strong>|<strong>--prog</strong> <em>programs</em>]\n</p>\n<p>\n<strong>txt2regex</strong> <strong>--showmeta</strong>\n</p>\n<p>\n<strong>txt2regex</strong> <strong>--showinfo</strong> <em>program</em> [<strong>--nocolor</strong>]\n</p>\n<p>\n<strong>txt2regex</strong> <strong>--history</strong> <em>value</em> [<strong>--all</strong>|<strong>--prog</strong> <em>programs</em>]\n</p>\n<p>\n<strong>txt2regex</strong> <strong>--make</strong> <em>label</em> [<strong>--all</strong>|<strong>--prog</strong> <em>programs</em>]\n</p>\n\n</section>\n<section>\n<h1>DESCRIPTION</h1>\n\n<p>\n<strong>txt2regex</strong> is a regular expression wizard that converts human\nsentences to regexes.\n</p>\n<p>\nIn a simple interactive console interface, the user answer questions and\n<strong>txt2regex</strong> builds the regexes for more than 20 programs.\n</p>\n<p>\n<em>https://aurelio.net/projects/txt2regex/</em>\n</p>\n\n</section>\n<section>\n<h1>OPTIONS</h1>\n\n<dl>\n<dt><strong>--all</strong></dt><dd>\nSelect all the available programs. Be aware that the list of available\nprograms is long. You will need a terminal window with more than 40\nlines for the user interface to fit. Also make sure that the <strong>$LINES</strong>\nshell variable is exported, so <strong>txt2regex</strong> can detect the current\nnumber of available lines.\n<p></p>\n</dd>\n<dt><strong>-h</strong>, <strong>--help</strong></dt><dd>\nPrint the help message and quit.\n<p></p>\n</dd>\n<dt><strong>--history &lt;value&gt;</strong></dt><dd>\nPrint a regex from the given history data. The history value is shown in\nthe last screen of the wizard, when you quit.\n<p></p>\n</dd>\n<dt><strong>--make &lt;label&gt;</strong></dt><dd>\nPrint a ready regex for the specified label. Inform an empty label to\nsee the list of available labels.\n<p></p>\n</dd>\n<dt><strong>--nocolor</strong></dt><dd>\nDo not use colors.\n<p></p>\n</dd>\n<dt><strong>--prog &lt;program1,program2,...&gt;</strong></dt><dd>\nSpecify which programs to use, separated by commas. Use <strong>--showmeta</strong>\nto see the complete list of available programs.\n<p></p>\n</dd>\n<dt><strong>--showinfo &lt;program&gt;</strong></dt><dd>\nPrint regex-related info about the specified program. Use <strong>--nocolor</strong>\nto have a text-only output (no control characters).\n<p></p>\n</dd>\n<dt><strong>--showmeta</strong></dt><dd>\nPrint a metacharacters table featuring all the programs.\n<p></p>\n</dd>\n<dt><strong>-V</strong>, <strong>--version</strong></dt><dd>\nPrint the program version and quit.\n<p></p>\n</dd>\n<dt><strong>--whitebg</strong></dt><dd>\nAdjust colors for white background terminals.\n</dd>\n</dl>\n\n</section>\n<section>\n<h1>EXAMPLES</h1>\n\n<dl>\n<dt>Using it as a wizard (interactive interface):</dt><dd>\n<p></p>\n<pre>\ntxt2regex\n</pre>\n\n<p></p>\n</dd>\n<dt>Specify a custom selection of programs for the wizard:</dt><dd>\n<p></p>\n<pre>\ntxt2regex --prog perl,python,php,javascript\n</pre>\n\n<p></p>\n</dd>\n<dt>Getting an extensive metacharacters table:</dt><dd>\n<p></p>\n<pre>\ntxt2regex --showmeta\n</pre>\n\n<p></p>\n</dd>\n<dt>Getting regex-related information about sed:</dt><dd>\n<p></p>\n<pre>\ntxt2regex --showinfo sed\n</pre>\n\n<p></p>\n</dd>\n<dt>Replay a regex by using history data:</dt><dd>\n<p></p>\n<pre>\ntxt2regex --history '16421¤:01¤:'\n</pre>\n\n<p></p>\n</dd>\n<dt>Getting handy ready-to-use regexes for common patterns:</dt><dd>\n<p></p>\n<pre>\ntxt2regex --make hour\ntxt2regex --make number3 --prog perl\ntxt2regex --make date2 --all\n</pre>\n\n</dd>\n</dl>\n\n</section>\n<section>\n<h1>WIZARD INTERFACE</h1>\n\n<pre>\n+---------------------------------------+\n| Top menu                              |\n| Group menu                            |\n|                                       |\n| Regexes of the selected programs      |\n| ...                                   |\n| ...                                   |\n|                                       |\n| History                               |\n| Prompt                                |\n|                                       |\n| The question                          |\n| The answers                           |\n| ...                                   |\n| ...                                   |\n+---------------------------------------+\n</pre>\n\n</section>\n<section>\n<h1>WIZARD COMMANDS</h1>\n\n<table>\n<tr>\n<td class=\"center\"><strong>.</strong></td>\n<td>Quit the program (with confirmation)</td>\n</tr>\n<tr>\n<td class=\"center\"><strong>0</strong></td>\n<td>Reset the regular expression</td>\n</tr>\n<tr>\n<td class=\"center\"><strong>1-9</strong></td>\n<td>Answers the questions</td>\n</tr>\n<tr>\n<td class=\"center\"><strong>*</strong></td>\n<td>Toggles color ON/OFF</td>\n</tr>\n<tr>\n<td class=\"center\"><strong>/</strong></td>\n<td>Add/remove programs</td>\n</tr>\n<tr>\n<td class=\"center\"><strong>|</strong></td>\n<td>Insert an alternation (where allowed)</td>\n</tr>\n<tr>\n<td class=\"center\"><strong>(</strong></td>\n<td>Open a new group (where allowed)</td>\n</tr>\n<tr>\n<td class=\"center\"><strong>)</strong></td>\n<td>Close the opened group (if any)</td>\n</tr>\n</table>\n\n</section>\n<section>\n<h1>BUGS</h1>\n\n<p>\n<a href=\"https://github.com/aureliojargas/txt2regex/issues\">https://github.com/aureliojargas/txt2regex/issues</a>\n</p>\n\n</section>\n<section>\n<h1>AUTHOR</h1>\n\n<p>\nAurelio Jargas &lt;&lt;verde (a) aurelio net&gt;&gt;\n</p>\n\n</section>\n<section>\n<h1>COPYRIGHT</h1>\n\n<p>\nCopyright © 2001-2020 Aurelio Jargas, GNU GPL v2\n</p>\n</section>\n</div>\n\n<!-- html code generated by txt2tags 3.4 (http://txt2tags.org) -->\n<!-- cmdline: txt2tags -t html man/txt2regex.t2t -->\n</article></body></html>\n"
  },
  {
    "path": "man/txt2regex.man",
    "content": ".TH \"TXT2REGEX\" 1 \"May 21, 2020\" \"\"\n\n.SH NAME\n.P\n\\fBtxt2regex\\fR \\-\\- console regular expression wizard\n.SH SYNOPSIS\n.P\n\\fBtxt2regex\\fR [\\fB\\-\\-nocolor\\fR|\\fB\\-\\-whitebg\\fR] [\\fB\\-\\-all\\fR|\\fB\\-\\-prog\\fR \\fIprograms\\fR]\n.P\n\\fBtxt2regex\\fR \\fB\\-\\-showmeta\\fR\n.P\n\\fBtxt2regex\\fR \\fB\\-\\-showinfo\\fR \\fIprogram\\fR [\\fB\\-\\-nocolor\\fR]\n.P\n\\fBtxt2regex\\fR \\fB\\-\\-history\\fR \\fIvalue\\fR [\\fB\\-\\-all\\fR|\\fB\\-\\-prog\\fR \\fIprograms\\fR]\n.P\n\\fBtxt2regex\\fR \\fB\\-\\-make\\fR \\fIlabel\\fR [\\fB\\-\\-all\\fR|\\fB\\-\\-prog\\fR \\fIprograms\\fR]\n.SH DESCRIPTION\n.P\n\\fBtxt2regex\\fR is a regular expression wizard that converts human\nsentences to regexes.\n.P\nIn a simple interactive console interface, the user answer questions and\n\\fBtxt2regex\\fR builds the regexes for more than 20 programs.\n.P\n\\fIhttps://aurelio.net/projects/txt2regex/\\fR\n.SH OPTIONS\n\n.TP\n\\fB\\-\\-all\\fR\nSelect all the available programs. Be aware that the list of available\nprograms is long. You will need a terminal window with more than 40\nlines for the user interface to fit. Also make sure that the \\fB$LINES\\fR\nshell variable is exported, so \\fBtxt2regex\\fR can detect the current\nnumber of available lines.\n\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint the help message and quit.\n\n.TP\n\\fB\\-\\-history <value>\\fR\nPrint a regex from the given history data. The history value is shown in\nthe last screen of the wizard, when you quit.\n\n.TP\n\\fB\\-\\-make <label>\\fR\nPrint a ready regex for the specified label. Inform an empty label to\nsee the list of available labels.\n\n.TP\n\\fB\\-\\-nocolor\\fR\nDo not use colors.\n\n.TP\n\\fB\\-\\-prog <program1,program2,...>\\fR\nSpecify which programs to use, separated by commas. Use \\fB\\-\\-showmeta\\fR\nto see the complete list of available programs.\n\n.TP\n\\fB\\-\\-showinfo <program>\\fR\nPrint regex\\-related info about the specified program. Use \\fB\\-\\-nocolor\\fR\nto have a text\\-only output (no control characters).\n\n.TP\n\\fB\\-\\-showmeta\\fR\nPrint a metacharacters table featuring all the programs.\n\n.TP\n\\fB\\-V\\fR, \\fB\\-\\-version\\fR\nPrint the program version and quit.\n\n.TP\n\\fB\\-\\-whitebg\\fR\nAdjust colors for white background terminals.\n\n.SH EXAMPLES\n\n.TP\nUsing it as a wizard (interactive interface):\n\n\n.nf\ntxt2regex\n.fi\n\n\n\n.TP\nSpecify a custom selection of programs for the wizard:\n\n\n.nf\ntxt2regex --prog perl,python,php,javascript\n.fi\n\n\n\n.TP\nGetting an extensive metacharacters table:\n\n\n.nf\ntxt2regex --showmeta\n.fi\n\n\n\n.TP\nGetting regex\\-related information about sed:\n\n\n.nf\ntxt2regex --showinfo sed\n.fi\n\n\n\n.TP\nReplay a regex by using history data:\n\n\n.nf\ntxt2regex --history '16421¤:01¤:'\n.fi\n\n\n\n.TP\nGetting handy ready\\-to\\-use regexes for common patterns:\n\n\n.nf\ntxt2regex --make hour\ntxt2regex --make number3 --prog perl\ntxt2regex --make date2 --all\n.fi\n\n\n\n.SH WIZARD INTERFACE\n\n.nf\n+---------------------------------------+\n| Top menu                              |\n| Group menu                            |\n|                                       |\n| Regexes of the selected programs      |\n| ...                                   |\n| ...                                   |\n|                                       |\n| History                               |\n| Prompt                                |\n|                                       |\n| The question                          |\n| The answers                           |\n| ...                                   |\n| ...                                   |\n+---------------------------------------+\n.fi\n\n\n.SH WIZARD COMMANDS\n\n.TS\ntab(^); cl.\n \\fB.\\fR^Quit the program (with confirmation)\n \\fB0\\fR^Reset the regular expression\n \\fB1\\-9\\fR^Answers the questions\n \\fB*\\fR^Toggles color ON/OFF\n \\fB/\\fR^Add/remove programs\n \\fB|\\fR^Insert an alternation (where allowed)\n \\fB(\\fR^Open a new group (where allowed)\n \\fB)\\fR^Close the opened group (if any)\n.TE\n\n.SH BUGS\n.P\nhttps://github.com/aureliojargas/txt2regex/issues\n.SH AUTHOR\n.P\nAurelio Jargas <verde@aurelio.net>\n.SH COPYRIGHT\n.P\nCopyright © 2001\\-2020 Aurelio Jargas, GNU GPL v2\n\n.\\\" man code generated by txt2tags 3.4 (http://txt2tags.org)\n.\\\" cmdline: txt2tags -t man man/txt2regex.t2t\n"
  },
  {
    "path": "man/txt2regex.t2t",
    "content": "TXT2REGEX\n\nMay 21, 2020\n\n%!target: man\n%!options(man) : -o txt2regex.man\n%!options(html): -o txt2regex.html --mask-email\n\n= NAME =\n\n**txt2regex** -- console regular expression wizard\n\n= SYNOPSIS =\n\n**txt2regex** [**\"\"--nocolor\"\"**|**\"\"--whitebg\"\"**] \"\"[\"\"**\"\"--all\"\"**|**\"\"--prog\"\"** //programs//]\n\n**txt2regex** **--showmeta**\n\n**txt2regex** **--showinfo** //program// [**\"\"--nocolor\"\"**]\n\n**txt2regex** **--history** //value// \"\"[\"\"**\"\"--all\"\"**|**\"\"--prog\"\"** //programs//]\n\n**txt2regex** **--make** //label// \"\"[\"\"**\"\"--all\"\"**|**\"\"--prog\"\"** //programs//]\n\n= DESCRIPTION =\n\n**txt2regex** is a regular expression wizard that converts human\nsentences to regexes.\n\nIn a simple interactive console interface, the user answer questions and\n**txt2regex** builds the regexes for more than 20 programs.\n\n//\"\"https://aurelio.net/projects/txt2regex/\"\"//\n\n= OPTIONS =\n\n: **--all**\nSelect all the available programs. Be aware that the list of available\nprograms is long. You will need a terminal window with more than 40\nlines for the user interface to fit. Also make sure that the **$LINES**\nshell variable is exported, so **txt2regex** can detect the current\nnumber of available lines.\n\n: **-h**, **--help**\nPrint the help message and quit.\n\n: **--history <value>**\nPrint a regex from the given history data. The history value is shown in\nthe last screen of the wizard, when you quit.\n\n: **--make <label>**\nPrint a ready regex for the specified label. Inform an empty label to\nsee the list of available labels.\n\n: **--nocolor**\nDo not use colors.\n\n: **--prog <program1,program2,...>**\nSpecify which programs to use, separated by commas. Use **--showmeta**\nto see the complete list of available programs.\n\n: **--showinfo <program>**\nPrint regex-related info about the specified program. Use **--nocolor**\nto have a text-only output (no control characters).\n\n: **--showmeta**\nPrint a metacharacters table featuring all the programs.\n\n: **-V**, **--version**\nPrint the program version and quit.\n\n: **--whitebg**\nAdjust colors for white background terminals.\n\n\n= EXAMPLES =\n\n: Using it as a wizard (interactive interface):\n\n``` txt2regex\n\n: Specify a custom selection of programs for the wizard:\n\n``` txt2regex --prog perl,python,php,javascript\n\n: Getting an extensive metacharacters table:\n\n``` txt2regex --showmeta\n\n: Getting regex-related information about sed:\n\n``` txt2regex --showinfo sed\n\n: Replay a regex by using history data:\n\n``` txt2regex --history '16421¤:01¤:'\n\n: Getting handy ready-to-use regexes for common patterns:\n\n```\ntxt2regex --make hour\ntxt2regex --make number3 --prog perl\ntxt2regex --make date2 --all\n```\n\n\n= WIZARD INTERFACE =\n\n```\n+---------------------------------------+\n| Top menu                              |\n| Group menu                            |\n|                                       |\n| Regexes of the selected programs      |\n| ...                                   |\n| ...                                   |\n|                                       |\n| History                               |\n| Prompt                                |\n|                                       |\n| The question                          |\n| The answers                           |\n| ...                                   |\n| ...                                   |\n+---------------------------------------+\n```\n\n= WIZARD COMMANDS =\n\n|   **.**    | Quit the program (with confirmation)\n|   **0**    | Reset the regular expression\n|  **1-9**   | Answers the questions\n|   *****    | Toggles color ON/OFF\n|   **/**    | Add/remove programs\n|   **|**    | Insert an alternation (where allowed)\n|   **(**    | Open a new group (where allowed)\n|   **)**    | Close the opened group (if any)\n\n= BUGS =\n\nhttps://github.com/aureliojargas/txt2regex/issues\n\n= AUTHOR =\n\nAurelio Jargas <verde@aurelio.net>\n\n= COPYRIGHT =\n\nCopyright © 2001-2020 Aurelio Jargas, GNU GPL v2\n"
  },
  {
    "path": "po/ca.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: txt2regex 0.9\\n\"\n\"POT-Creation-Date: 2020-05-17 07:16 CEST\\n\"\n\"PO-Revision-Date: 2004-11-16 10:52+0100\\n\"\n\"Last-Translator: ChAOS ChAoS@gmail.com\\n\"\n\"Language: ca\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: KBabel 1.9.1\\n\"\n\n#: txt2regex.sh:92\nmsgid \"ERROR\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:118 txt2regex.sh:120 txt2regex.sh:129\nmsgid \"PROGRAMS\"\nmsgstr \"PROGRAMES\"\n\n#: txt2regex.sh:112 txt2regex.sh:114 txt2regex.sh:116 txt2regex.sh:118\n#: txt2regex.sh:120\nmsgid \"usage:\"\nmsgstr \"ús:\"\n\n#: txt2regex.sh:116 txt2regex.sh:134\nmsgid \"PROGRAM\"\nmsgstr \"PROGRAMA\"\n\n#: txt2regex.sh:118 txt2regex.sh:136\nmsgid \"VALUE\"\nmsgstr \"VALOR\"\n\n#: txt2regex.sh:120 txt2regex.sh:138\nmsgid \"LABEL\"\nmsgstr \"ETIQUETA\"\n\n#: txt2regex.sh:122\nmsgid \"Options:\"\nmsgstr \"Opcions:\"\n\n#: txt2regex.sh:124\nmsgid \"Select all the available programs\"\nmsgstr \"Funciona amb tots els programes registrats\"\n\n#: txt2regex.sh:126\nmsgid \"Do not use colors\"\nmsgstr \"No fa servir colors\"\n\n#: txt2regex.sh:128\nmsgid \"Adjust colors for white background terminals\"\nmsgstr \"Colors ajustats per a terminals amb fons blanc\"\n\n#: txt2regex.sh:130\nmsgid \"Specify which programs to use, separated by commas\"\nmsgstr \"Tria quins programes vols fer servir, separats per comes\"\n\n#: txt2regex.sh:133\nmsgid \"Print a metacharacters table featuring all the programs\"\nmsgstr \"Imprimeix una taula de metacaràcters amb tots els programes\"\n\n#: txt2regex.sh:135\nmsgid \"Print regex-related info about the specified program\"\nmsgstr \"Imprimeix la informació regex sobre el programa especificat\"\n\n#: txt2regex.sh:137\nmsgid \"Print a regex from the given history data\"\nmsgstr \"Imprimeix el regex de l'arxiu d'historial donat\"\n\n#: txt2regex.sh:139\nmsgid \"Print a ready regex for the specified label\"\nmsgstr \"Imprimeix el regex per defecte per l'etiqueta especificada\"\n\n#: txt2regex.sh:142\nmsgid \"Print the program version and quit\"\nmsgstr \"Imprimeix la versió del programa i surt\"\n\n#: txt2regex.sh:144\nmsgid \"Print the help message and quit\"\nmsgstr \"Imprimeix el missatge d'ajuda i surt\"\n\n#: txt2regex.sh:277\nmsgid \"unknown program\"\nmsgstr \"programa desconegut\"\n\n#: txt2regex.sh:305\nmsgid \"invalid argument\"\nmsgstr \"argument invàlid\"\n\n#: txt2regex.sh:306\nmsgid \"valid names:\"\nmsgstr \"noms vàlids:\"\n\n#: txt2regex.sh:348\nmsgid \"invalid option\"\nmsgstr \"opció no vàlida\"\n\n#: txt2regex.sh:360\nmsgid \"start to match\"\nmsgstr \"començar a casar\"\n\n#: txt2regex.sh:361\nmsgid \"on the line beginning\"\nmsgstr \"a principi de línia\"\n\n#: txt2regex.sh:362\nmsgid \"in any part of the line\"\nmsgstr \"a qualsevol part de la línia\"\n\n#: txt2regex.sh:371\nmsgid \"followed by\"\nmsgstr \"seguit de\"\n\n#: txt2regex.sh:372\nmsgid \"any character\"\nmsgstr \"qualsevol caràcter\"\n\n#: txt2regex.sh:373\nmsgid \"a specific character\"\nmsgstr \"un caracter específic\"\n\n#: txt2regex.sh:374\nmsgid \"a literal string\"\nmsgstr \"una cadena literal\"\n\n#: txt2regex.sh:375\nmsgid \"an allowed characters list\"\nmsgstr \"una llista de caràcters permesos\"\n\n#: txt2regex.sh:376\nmsgid \"a forbidden characters list\"\nmsgstr \"una llista de caràcters prohibits\"\n\n#: txt2regex.sh:377\nmsgid \"a special combination\"\nmsgstr \"una combinació especial\"\n\n#: txt2regex.sh:378\nmsgid \"a POSIX combination (locale aware)\"\nmsgstr \"una combinació POSIX (subjecte a localització)\"\n\n#: txt2regex.sh:379\nmsgid \"a ready regex (not implemented)\"\nmsgstr \"una regex preparada (sense implementar)\"\n\n#: txt2regex.sh:380\nmsgid \"anything\"\nmsgstr \"qualsevol cosa\"\n\n#: txt2regex.sh:396\nmsgid \"how many times (repetition)\"\nmsgstr \"quantes vegades (repetició)\"\n\n#: txt2regex.sh:397\nmsgid \"one\"\nmsgstr \"una\"\n\n#: txt2regex.sh:398\nmsgid \"zero or one (optional)\"\nmsgstr \"una o cap (opcional)\"\n\n#: txt2regex.sh:399\nmsgid \"zero or more\"\nmsgstr \"cap o més\"\n\n#: txt2regex.sh:400\nmsgid \"one or more\"\nmsgstr \"una o més\"\n\n#: txt2regex.sh:401\nmsgid \"exactly N\"\nmsgstr \"exactament N\"\n\n#: txt2regex.sh:402\nmsgid \"up to N\"\nmsgstr \"fins a N\"\n\n#: txt2regex.sh:403\nmsgid \"at least N\"\nmsgstr \"almenys N\"\n\n#: txt2regex.sh:408 txt2regex.sh:428\nmsgid \"uppercase letters\"\nmsgstr \"lletres majúscules\"\n\n#: txt2regex.sh:409 txt2regex.sh:427\nmsgid \"lowercase letters\"\nmsgstr \"lletres minúscules\"\n\n#: txt2regex.sh:410 txt2regex.sh:429\nmsgid \"numbers\"\nmsgstr \"nombres\"\n\n#: txt2regex.sh:411\nmsgid \"underscore\"\nmsgstr \"barra baixa\"\n\n#: txt2regex.sh:412\nmsgid \"space\"\nmsgstr \"espai\"\n\n#: txt2regex.sh:413\nmsgid \"TAB\"\nmsgstr \"Tabulador (TAB)\"\n\n#: txt2regex.sh:426\nmsgid \"letters\"\nmsgstr \"lletres\"\n\n#: txt2regex.sh:430\nmsgid \"letters and numbers\"\nmsgstr \"lletres i nombres\"\n\n#: txt2regex.sh:431\nmsgid \"hexadecimal numbers\"\nmsgstr \"nombres hexadecimals\"\n\n#: txt2regex.sh:432\nmsgid \"whitespaces (space and TAB)\"\nmsgstr \"espais en blanc (espais i tabuladors)\"\n\n#: txt2regex.sh:433\nmsgid \"graphic chars (not-whitespace)\"\nmsgstr \"caràcters gràfics (no espais en blanc)\"\n\n#: txt2regex.sh:448\nmsgid \"quit\"\nmsgstr \"sortir\"\n\n#: txt2regex.sh:449\nmsgid \"reset\"\nmsgstr \"reiniciar\"\n\n#: txt2regex.sh:450\nmsgid \"color\"\nmsgstr \"color\"\n\n#: txt2regex.sh:451\nmsgid \"programs\"\nmsgstr \"programes\"\n\n#: txt2regex.sh:474\nmsgid \"or\"\nmsgstr \"o\"\n\n#: txt2regex.sh:475\nmsgid \"open group\"\nmsgstr \"obrir grup\"\n\n#: txt2regex.sh:476\nmsgid \"close group\"\nmsgstr \"tancar grup\"\n\n#: txt2regex.sh:483\nmsgid \"not supported\"\nmsgstr \"sense suport\"\n\n#: txt2regex.sh:724\nmsgid \"NOTE: . [] [^] and * are the same on all programs.\"\nmsgstr \"NOTA: . [] [^] i * són el mateix en tots els programes.\"\n\n#: txt2regex.sh:735 txt2regex.sh:736\nmsgid \"NO\"\nmsgstr \"NO\"\n\n#: txt2regex.sh:748 txt2regex.sh:749\nmsgid \"YES\"\nmsgstr \"SÍ\"\n\n#: txt2regex.sh:765\nmsgid \"program\"\nmsgstr \"programa\"\n\n#: txt2regex.sh:766\nmsgid \"metas\"\nmsgstr \"metes\"\n\n#: txt2regex.sh:767\nmsgid \"esc meta\"\nmsgstr \"esc meta\"\n\n#: txt2regex.sh:768\nmsgid \"need esc\"\nmsgstr \"esc necessari\"\n\n#: txt2regex.sh:769\nmsgid \"\\\\t in []\"\nmsgstr \"\\\\t a []\"\n\n#: txt2regex.sh:823\nmsgid \"Your terminal has %d lines, but txt2regex needs at least %d lines.\"\nmsgstr \"\"\n\n#: txt2regex.sh:828\nmsgid \"Increase the number of lines or select less programs using --prog.\"\nmsgstr \"\"\n\n#: txt2regex.sh:829\nmsgid \"If this line number detection is incorrect, export the LINES variable.\"\nmsgstr \"\"\n\n#: txt2regex.sh:1027\nmsgid \"which one?\"\nmsgstr \"quin?\"\n\n#: txt2regex.sh:1043\nmsgid \"which?\"\nmsgstr \"quin?\"\n\n#: txt2regex.sh:1326\nmsgid \"exit\"\nmsgstr \"sortir\"\n\n#: txt2regex.sh:1327\nmsgid \"press the letters to (un)select the items\"\nmsgstr \"pressioni les lletres per (des)seleccionar \"\n\n#: txt2regex.sh:1505\nmsgid \"repeated\"\nmsgstr \"repetit\"\n\n#: txt2regex.sh:1507\nmsgid \"times\"\nmsgstr \"vegades\"\n\n#: txt2regex.sh:1516\nmsgid \"Really quit?\"\nmsgstr \"Realment vols sortir?\"\n\n#: txt2regex.sh:1540\nmsgid \"no regex\"\nmsgstr \"sense regex\"\n"
  },
  {
    "path": "po/de_DE.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: txt2regex 0.5\\n\"\n\"POT-Creation-Date: 2020-05-17 07:16 CEST\\n\"\n\"PO-Revision-Date: 2001-08-29 09:55+0100\\n\"\n\"Last-Translator: Jan Parthey <parthey@web.de>\\n\"\n\"Language: de_DE\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: txt2regex.sh:92\nmsgid \"ERROR\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:118 txt2regex.sh:120 txt2regex.sh:129\nmsgid \"PROGRAMS\"\nmsgstr \"PROGRAMME\"\n\n#: txt2regex.sh:112 txt2regex.sh:114 txt2regex.sh:116 txt2regex.sh:118\n#: txt2regex.sh:120\nmsgid \"usage:\"\nmsgstr \"benutze:\"\n\n#: txt2regex.sh:116 txt2regex.sh:134\nmsgid \"PROGRAM\"\nmsgstr \"PROGRAMM\"\n\n#: txt2regex.sh:118 txt2regex.sh:136\nmsgid \"VALUE\"\nmsgstr \"WERT\"\n\n#: txt2regex.sh:120 txt2regex.sh:138\nmsgid \"LABEL\"\nmsgstr \"\"\n\n#: txt2regex.sh:122\nmsgid \"Options:\"\nmsgstr \"Optionen:\"\n\n#: txt2regex.sh:124\nmsgid \"Select all the available programs\"\nmsgstr \"Arbeitet mit allen registrierten Programmen\"\n\n#: txt2regex.sh:126\nmsgid \"Do not use colors\"\nmsgstr \"\"\n\n#: txt2regex.sh:128\nmsgid \"Adjust colors for white background terminals\"\nmsgstr \"Farben für Terminals mit weißen Hintergrund\"\n\n#: txt2regex.sh:130\nmsgid \"Specify which programs to use, separated by commas\"\nmsgstr \"\"\n\n#: txt2regex.sh:133\nmsgid \"Print a metacharacters table featuring all the programs\"\nmsgstr \"Druckt eine komplette Metachar Tabelle für alle Programme\"\n\n#: txt2regex.sh:135\nmsgid \"Print regex-related info about the specified program\"\nmsgstr \"Druckt regex Infos über das angegebene Programm\"\n\n#: txt2regex.sh:137\nmsgid \"Print a regex from the given history data\"\nmsgstr \"Druckt eine RegEx aus den history Daten\"\n\n#: txt2regex.sh:139\nmsgid \"Print a ready regex for the specified label\"\nmsgstr \"\"\n\n#: txt2regex.sh:142\nmsgid \"Print the program version and quit\"\nmsgstr \"\"\n\n#: txt2regex.sh:144\nmsgid \"Print the help message and quit\"\nmsgstr \"\"\n\n#: txt2regex.sh:277\nmsgid \"unknown program\"\nmsgstr \"unbekanntes Programm\"\n\n#: txt2regex.sh:305\nmsgid \"invalid argument\"\nmsgstr \"\"\n\n#: txt2regex.sh:306\nmsgid \"valid names:\"\nmsgstr \"\"\n\n#: txt2regex.sh:348\nmsgid \"invalid option\"\nmsgstr \"\"\n\n#: txt2regex.sh:360\nmsgid \"start to match\"\nmsgstr \"Beginn der Übereinstimmung\"\n\n#: txt2regex.sh:361\nmsgid \"on the line beginning\"\nmsgstr \"am Zeilenanfang\"\n\n#: txt2regex.sh:362\nmsgid \"in any part of the line\"\nmsgstr \"irgendwo in der Zeile\"\n\n#: txt2regex.sh:371\nmsgid \"followed by\"\nmsgstr \"gefolgt von\"\n\n#: txt2regex.sh:372\nmsgid \"any character\"\nmsgstr \"einem beliebigen Zeichen\"\n\n#: txt2regex.sh:373\nmsgid \"a specific character\"\nmsgstr \"einem bestimmten Zeichen\"\n\n#: txt2regex.sh:374\nmsgid \"a literal string\"\nmsgstr \"einer Buchstabenfolge\"\n\n#: txt2regex.sh:375\nmsgid \"an allowed characters list\"\nmsgstr \"einer Liste erlaubter Zeichen\"\n\n#: txt2regex.sh:376\nmsgid \"a forbidden characters list\"\nmsgstr \"einer Liste verbotener Zeichen\"\n\n#: txt2regex.sh:377\nmsgid \"a special combination\"\nmsgstr \"einer speziellen Kombination\"\n\n#: txt2regex.sh:378\nmsgid \"a POSIX combination (locale aware)\"\nmsgstr \"einer POSIX Kombination (lokale Einstellungen beachten)\"\n\n#: txt2regex.sh:379\nmsgid \"a ready regex (not implemented)\"\nmsgstr \"einer fertigen regex (noch nicht implementiert)\"\n\n#: txt2regex.sh:380\nmsgid \"anything\"\nmsgstr \"etwas Beliebigen\"\n\n#: txt2regex.sh:396\nmsgid \"how many times (repetition)\"\nmsgstr \"wie oft (Wiederholung)\"\n\n#: txt2regex.sh:397\nmsgid \"one\"\nmsgstr \"einmal\"\n\n#: txt2regex.sh:398\nmsgid \"zero or one (optional)\"\nmsgstr \"null oder einmal (wahlweise)\"\n\n#: txt2regex.sh:399\nmsgid \"zero or more\"\nmsgstr \"null oder mehrmals\"\n\n#: txt2regex.sh:400\nmsgid \"one or more\"\nmsgstr \"einmmal oder mehrmals\"\n\n#: txt2regex.sh:401\nmsgid \"exactly N\"\nmsgstr \"exakt N mal\"\n\n#: txt2regex.sh:402\nmsgid \"up to N\"\nmsgstr \"bis zu N mal\"\n\n#: txt2regex.sh:403\nmsgid \"at least N\"\nmsgstr \"weniger als N mal\"\n\n#: txt2regex.sh:408 txt2regex.sh:428\nmsgid \"uppercase letters\"\nmsgstr \"Großbuchstaben\"\n\n#: txt2regex.sh:409 txt2regex.sh:427\nmsgid \"lowercase letters\"\nmsgstr \"Kleinbuchstaben\"\n\n#: txt2regex.sh:410 txt2regex.sh:429\nmsgid \"numbers\"\nmsgstr \"Zahlen\"\n\n#: txt2regex.sh:411\nmsgid \"underscore\"\nmsgstr \"Unterstrich\"\n\n#: txt2regex.sh:412\nmsgid \"space\"\nmsgstr \"Leerzeichen\"\n\n#: txt2regex.sh:413\nmsgid \"TAB\"\nmsgstr \"TAB\"\n\n#: txt2regex.sh:426\nmsgid \"letters\"\nmsgstr \"Buchstaben\"\n\n#: txt2regex.sh:430\nmsgid \"letters and numbers\"\nmsgstr \"Buchstaben und Zahlen\"\n\n#: txt2regex.sh:431\nmsgid \"hexadecimal numbers\"\nmsgstr \"Hexadezimalzahlen\"\n\n#: txt2regex.sh:432\nmsgid \"whitespaces (space and TAB)\"\nmsgstr \"Zwischenraum (Leerzeichen und TAB)\"\n\n#: txt2regex.sh:433\nmsgid \"graphic chars (not-whitespace)\"\nmsgstr \"grafische Zeichen (keine Leerzeichen)\"\n\n#: txt2regex.sh:448\nmsgid \"quit\"\nmsgstr \"verlassen\"\n\n#: txt2regex.sh:449\nmsgid \"reset\"\nmsgstr \"zurückstellen\"\n\n#: txt2regex.sh:450\nmsgid \"color\"\nmsgstr \"Farbe\"\n\n#: txt2regex.sh:451\nmsgid \"programs\"\nmsgstr \"Programme\"\n\n#: txt2regex.sh:474\nmsgid \"or\"\nmsgstr \"oder\"\n\n#: txt2regex.sh:475\nmsgid \"open group\"\nmsgstr \"öffne Gruppe\"\n\n#: txt2regex.sh:476\nmsgid \"close group\"\nmsgstr \"schließe Gruppe\"\n\n#: txt2regex.sh:483\nmsgid \"not supported\"\nmsgstr \"nicht unterstützt\"\n\n#: txt2regex.sh:724\nmsgid \"NOTE: . [] [^] and * are the same on all programs.\"\nmsgstr \"Anmerkung: . [] [^] und * bedeuten das selbe bei allen Programmen\"\n\n#: txt2regex.sh:735 txt2regex.sh:736\nmsgid \"NO\"\nmsgstr \"NEIN\"\n\n#: txt2regex.sh:748 txt2regex.sh:749\nmsgid \"YES\"\nmsgstr \"JA\"\n\n#: txt2regex.sh:765\nmsgid \"program\"\nmsgstr \"Programm\"\n\n#: txt2regex.sh:766\nmsgid \"metas\"\nmsgstr \"metas\"\n\n#: txt2regex.sh:767\nmsgid \"esc meta\"\nmsgstr \"esc meta\"\n\n#: txt2regex.sh:768\nmsgid \"need esc\"\nmsgstr \"need esc\"\n\n#: txt2regex.sh:769\nmsgid \"\\\\t in []\"\nmsgstr \"\\\\t in []\"\n\n#: txt2regex.sh:823\nmsgid \"Your terminal has %d lines, but txt2regex needs at least %d lines.\"\nmsgstr \"\"\n\n#: txt2regex.sh:828\nmsgid \"Increase the number of lines or select less programs using --prog.\"\nmsgstr \"\"\n\n#: txt2regex.sh:829\nmsgid \"If this line number detection is incorrect, export the LINES variable.\"\nmsgstr \"\"\n\n#: txt2regex.sh:1027\nmsgid \"which one?\"\nmsgstr \"welches?\"\n\n#: txt2regex.sh:1043\nmsgid \"which?\"\nmsgstr \"welche?\"\n\n#: txt2regex.sh:1326\nmsgid \"exit\"\nmsgstr \"beenden\"\n\n#: txt2regex.sh:1327\nmsgid \"press the letters to (un)select the items\"\nmsgstr \"drücken Sie den Buchstaben um das Feld (an/ab)zuwählen\"\n\n#: txt2regex.sh:1505\nmsgid \"repeated\"\nmsgstr \"wiederholt\"\n\n#: txt2regex.sh:1507\nmsgid \"times\"\nmsgstr \" \"\n\n#: txt2regex.sh:1516\nmsgid \"Really quit?\"\nmsgstr \"Wirklich beenden?\"\n\n#: txt2regex.sh:1540\nmsgid \"no regex\"\nmsgstr \"keine regex\"\n"
  },
  {
    "path": "po/es_ES.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: txt2regex 0.7\\n\"\n\"POT-Creation-Date: 2020-05-17 07:16 CEST\\n\"\n\"PO-Revision-Date: 2002-03-12 20:03-0000\\n\"\n\"Last-Translator: Diego Moya Velázquez <diego.moya@madrid.com>\\n\"\n\"Language: es_ES\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8BIT\\n\"\n\n#: txt2regex.sh:92\nmsgid \"ERROR\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:118 txt2regex.sh:120 txt2regex.sh:129\nmsgid \"PROGRAMS\"\nmsgstr \"PROGRAMAS\"\n\n#: txt2regex.sh:112 txt2regex.sh:114 txt2regex.sh:116 txt2regex.sh:118\n#: txt2regex.sh:120\nmsgid \"usage:\"\nmsgstr \"uso:\"\n\n#: txt2regex.sh:116 txt2regex.sh:134\nmsgid \"PROGRAM\"\nmsgstr \"PROGRAMA\"\n\n#: txt2regex.sh:118 txt2regex.sh:136\nmsgid \"VALUE\"\nmsgstr \"VALOR\"\n\n#: txt2regex.sh:120 txt2regex.sh:138\nmsgid \"LABEL\"\nmsgstr \"NOMBRE\"\n\n#: txt2regex.sh:122\nmsgid \"Options:\"\nmsgstr \"Opciones:\"\n\n#: txt2regex.sh:124\nmsgid \"Select all the available programs\"\nmsgstr \"Selecciona todos los programas disponibles\"\n\n#: txt2regex.sh:126\nmsgid \"Do not use colors\"\nmsgstr \"No usar colores\"\n\n#: txt2regex.sh:128\nmsgid \"Adjust colors for white background terminals\"\nmsgstr \"Colores ajustados para terminales de fondo blanco\"\n\n#: txt2regex.sh:130\nmsgid \"Specify which programs to use, separated by commas\"\nmsgstr \"Escoge qué programas usar, separados por comas\"\n\n#: txt2regex.sh:133\nmsgid \"Print a metacharacters table featuring all the programs\"\nmsgstr \"Muestra una tabla con los metacaracteres para todos los programas\"\n\n#: txt2regex.sh:135\nmsgid \"Print regex-related info about the specified program\"\nmsgstr \"Muestra información sobre las RegEx del programa\"\n\n#: txt2regex.sh:137\nmsgid \"Print a regex from the given history data\"\nmsgstr \"\"\n\n#: txt2regex.sh:139\nmsgid \"Print a ready regex for the specified label\"\nmsgstr \"\"\n\n#: txt2regex.sh:142\nmsgid \"Print the program version and quit\"\nmsgstr \"Muestra la versión del programa y termina\"\n\n#: txt2regex.sh:144\nmsgid \"Print the help message and quit\"\nmsgstr \"Muestra el mensaje de ayuda y termina\"\n\n#: txt2regex.sh:277\nmsgid \"unknown program\"\nmsgstr \"programa desconocido\"\n\n#: txt2regex.sh:305\nmsgid \"invalid argument\"\nmsgstr \"argumento no válido\"\n\n#: txt2regex.sh:306\nmsgid \"valid names:\"\nmsgstr \"nombres válidos:\"\n\n#: txt2regex.sh:348\nmsgid \"invalid option\"\nmsgstr \"opción no válida\"\n\n#: txt2regex.sh:360\nmsgid \"start to match\"\nmsgstr \"hacer coincidir\"\n\n#: txt2regex.sh:361\nmsgid \"on the line beginning\"\nmsgstr \"al comienzo de la línea\"\n\n#: txt2regex.sh:362\nmsgid \"in any part of the line\"\nmsgstr \"en cualquier parte de la línea\"\n\n#: txt2regex.sh:371\nmsgid \"followed by\"\nmsgstr \"seguido de\"\n\n#: txt2regex.sh:372\nmsgid \"any character\"\nmsgstr \"un carácter cualquiera\"\n\n#: txt2regex.sh:373\nmsgid \"a specific character\"\nmsgstr \"un carácter específico\"\n\n#: txt2regex.sh:374\nmsgid \"a literal string\"\nmsgstr \"una cadena literal de caracteres\"\n\n#: txt2regex.sh:375\nmsgid \"an allowed characters list\"\nmsgstr \"una lista de caracteres permitidos\"\n\n#: txt2regex.sh:376\nmsgid \"a forbidden characters list\"\nmsgstr \"una lista de caracteres prohibidos\"\n\n#: txt2regex.sh:377\nmsgid \"a special combination\"\nmsgstr \"una combinación especial\"\n\n#: txt2regex.sh:378\nmsgid \"a POSIX combination (locale aware)\"\nmsgstr \"una combinación POSIX (incluyendo caracteres locales)\"\n\n#: txt2regex.sh:379\nmsgid \"a ready regex (not implemented)\"\nmsgstr \"una regex lista para usar (no implementado)\"\n\n#: txt2regex.sh:380\nmsgid \"anything\"\nmsgstr \"cualquier cosa\"\n\n#: txt2regex.sh:396\nmsgid \"how many times (repetition)\"\nmsgstr \"cuántas veces (repetición)\"\n\n#: txt2regex.sh:397\nmsgid \"one\"\nmsgstr \"una\"\n\n#: txt2regex.sh:398\nmsgid \"zero or one (optional)\"\nmsgstr \"cero o una (opcional)\"\n\n#: txt2regex.sh:399\nmsgid \"zero or more\"\nmsgstr \"cero o más\"\n\n#: txt2regex.sh:400\nmsgid \"one or more\"\nmsgstr \"una o más\"\n\n#: txt2regex.sh:401\nmsgid \"exactly N\"\nmsgstr \"exactamente N\"\n\n#: txt2regex.sh:402\nmsgid \"up to N\"\nmsgstr \"como mucho N\"\n\n#: txt2regex.sh:403\nmsgid \"at least N\"\nmsgstr \"como mínimo N\"\n\n#: txt2regex.sh:408 txt2regex.sh:428\nmsgid \"uppercase letters\"\nmsgstr \"letras mayúsculas\"\n\n#: txt2regex.sh:409 txt2regex.sh:427\nmsgid \"lowercase letters\"\nmsgstr \"letras minúsculas\"\n\n#: txt2regex.sh:410 txt2regex.sh:429\nmsgid \"numbers\"\nmsgstr \"cifras\"\n\n#: txt2regex.sh:411\nmsgid \"underscore\"\nmsgstr \"carácter de subrayado\"\n\n#: txt2regex.sh:412\nmsgid \"space\"\nmsgstr \"espacio\"\n\n#: txt2regex.sh:413\nmsgid \"TAB\"\nmsgstr \"TAB\"\n\n#: txt2regex.sh:426\nmsgid \"letters\"\nmsgstr \"letras\"\n\n#: txt2regex.sh:430\nmsgid \"letters and numbers\"\nmsgstr \"cifras y letras\"\n\n#: txt2regex.sh:431\nmsgid \"hexadecimal numbers\"\nmsgstr \"cifras hexadecimales\"\n\n#: txt2regex.sh:432\nmsgid \"whitespaces (space and TAB)\"\nmsgstr \"blancos (espacio y TAB)\"\n\n#: txt2regex.sh:433\nmsgid \"graphic chars (not-whitespace)\"\nmsgstr \"caracteres gráficos (no blancos)\"\n\n#: txt2regex.sh:448\nmsgid \"quit\"\nmsgstr \"salir\"\n\n#: txt2regex.sh:449\nmsgid \"reset\"\nmsgstr \"reiniciar\"\n\n#: txt2regex.sh:450\nmsgid \"color\"\nmsgstr \"color\"\n\n#: txt2regex.sh:451\nmsgid \"programs\"\nmsgstr \"programas\"\n\n#: txt2regex.sh:474\nmsgid \"or\"\nmsgstr \"o\"\n\n#: txt2regex.sh:475\nmsgid \"open group\"\nmsgstr \"abrir grupo\"\n\n#: txt2regex.sh:476\nmsgid \"close group\"\nmsgstr \"cerrar grupo\"\n\n#: txt2regex.sh:483\nmsgid \"not supported\"\nmsgstr \"no soportado\"\n\n#: txt2regex.sh:724\nmsgid \"NOTE: . [] [^] and * are the same on all programs.\"\nmsgstr \"NOTA: . [] [^] y * son iguales para todos los programas.\"\n\n#: txt2regex.sh:735 txt2regex.sh:736\nmsgid \"NO\"\nmsgstr \"NO\"\n\n#: txt2regex.sh:748 txt2regex.sh:749\nmsgid \"YES\"\nmsgstr \"SI\"\n\n#: txt2regex.sh:765\nmsgid \"program\"\nmsgstr \"programa\"\n\n#: txt2regex.sh:766\nmsgid \"metas\"\nmsgstr \"metacaracteres\"\n\n#: txt2regex.sh:767\nmsgid \"esc meta\"\nmsgstr \"metacarácter de escape\"\n\n#: txt2regex.sh:768\nmsgid \"need esc\"\nmsgstr \"necesitan escape\"\n\n#: txt2regex.sh:769\nmsgid \"\\\\t in []\"\nmsgstr \"\\\\t en []\"\n\n#: txt2regex.sh:823\nmsgid \"Your terminal has %d lines, but txt2regex needs at least %d lines.\"\nmsgstr \"\"\n\n#: txt2regex.sh:828\nmsgid \"Increase the number of lines or select less programs using --prog.\"\nmsgstr \"\"\n\n#: txt2regex.sh:829\nmsgid \"If this line number detection is incorrect, export the LINES variable.\"\nmsgstr \"\"\n\n#: txt2regex.sh:1027\nmsgid \"which one?\"\nmsgstr \"¿cuál?\"\n\n#: txt2regex.sh:1043\nmsgid \"which?\"\nmsgstr \"¿cuáles?\"\n\n#: txt2regex.sh:1326\nmsgid \"exit\"\nmsgstr \"salir\"\n\n#: txt2regex.sh:1327\nmsgid \"press the letters to (un)select the items\"\nmsgstr \"pulse las letras para (des)ativar los items\"\n\n#: txt2regex.sh:1505\nmsgid \"repeated\"\nmsgstr \"repetido\"\n\n#: txt2regex.sh:1507\nmsgid \"times\"\nmsgstr \"veces\"\n\n#: txt2regex.sh:1516\nmsgid \"Really quit?\"\nmsgstr \"¿Salir?\"\n\n#: txt2regex.sh:1540\nmsgid \"no regex\"\nmsgstr \"ninguna regex\"\n"
  },
  {
    "path": "po/fr_FR.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: txt2regex 0.9\\n\"\n\"POT-Creation-Date: 2020-05-17 07:16 CEST\\n\"\n\"PO-Revision-Date: 2004-09-29 20:57+0200\\n\"\n\"Last-Translator: wwp <subscript@free.fr>\\n\"\n\"Language: fr_FR\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: KBabel 1.3.1\\n\"\n\n#: txt2regex.sh:92\nmsgid \"ERROR\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:118 txt2regex.sh:120 txt2regex.sh:129\nmsgid \"PROGRAMS\"\nmsgstr \"PROGRAMMES\"\n\n#: txt2regex.sh:112 txt2regex.sh:114 txt2regex.sh:116 txt2regex.sh:118\n#: txt2regex.sh:120\nmsgid \"usage:\"\nmsgstr \"usage :\"\n\n#: txt2regex.sh:116 txt2regex.sh:134\nmsgid \"PROGRAM\"\nmsgstr \"PROGRAMME\"\n\n#: txt2regex.sh:118 txt2regex.sh:136\nmsgid \"VALUE\"\nmsgstr \"VALEUR\"\n\n#: txt2regex.sh:120 txt2regex.sh:138\nmsgid \"LABEL\"\nmsgstr \"NOM\"\n\n#: txt2regex.sh:122\nmsgid \"Options:\"\nmsgstr \"Options :\"\n\n#: txt2regex.sh:124\nmsgid \"Select all the available programs\"\nmsgstr \"Utiliser tous les programmes supportés\"\n\n#: txt2regex.sh:126\nmsgid \"Do not use colors\"\nmsgstr \"Ne pas utiliser de couleur\"\n\n#: txt2regex.sh:128\nmsgid \"Adjust colors for white background terminals\"\nmsgstr \"Ajuster les couleurs pour les terminaux à fond clair\"\n\n#: txt2regex.sh:130\nmsgid \"Specify which programs to use, separated by commas\"\nmsgstr \"Programmes à utiliser (liste de programmes séparés par une virgule)\"\n\n#: txt2regex.sh:133\nmsgid \"Print a metacharacters table featuring all the programs\"\nmsgstr \"Afficher la table des métacaractères pour chaque programme\"\n\n#: txt2regex.sh:135\nmsgid \"Print regex-related info about the specified program\"\nmsgstr \"Afficher des informations relatives à ce programme\"\n\n#: txt2regex.sh:137\nmsgid \"Print a regex from the given history data\"\nmsgstr \"Afficher une regex déjà utilisée auparavant\"\n\n#: txt2regex.sh:139\nmsgid \"Print a ready regex for the specified label\"\nmsgstr \"Afficher la regex correspondant à cette présélection\"\n\n#: txt2regex.sh:142\nmsgid \"Print the program version and quit\"\nmsgstr \"Afficher le nom et la version du logiciel puis quitter\"\n\n#: txt2regex.sh:144\nmsgid \"Print the help message and quit\"\nmsgstr \"Afficher l'aide puis quitter\"\n\n#: txt2regex.sh:277\nmsgid \"unknown program\"\nmsgstr \"programme inconnu\"\n\n#: txt2regex.sh:305\nmsgid \"invalid argument\"\nmsgstr \"argument invalide\"\n\n#: txt2regex.sh:306\nmsgid \"valid names:\"\nmsgstr \"noms possibles :\"\n\n#: txt2regex.sh:348\nmsgid \"invalid option\"\nmsgstr \"option invalide\"\n\n#: txt2regex.sh:360\nmsgid \"start to match\"\nmsgstr \"début de séquence à trouver\"\n\n#: txt2regex.sh:361\nmsgid \"on the line beginning\"\nmsgstr \"en début de ligne\"\n\n#: txt2regex.sh:362\nmsgid \"in any part of the line\"\nmsgstr \"n'importe où dans la ligne\"\n\n#: txt2regex.sh:371\nmsgid \"followed by\"\nmsgstr \"suivi par\"\n\n#: txt2regex.sh:372\nmsgid \"any character\"\nmsgstr \"n'importe quel caractère\"\n\n#: txt2regex.sh:373\nmsgid \"a specific character\"\nmsgstr \"un caractère en particulier\"\n\n#: txt2regex.sh:374\nmsgid \"a literal string\"\nmsgstr \"une chaîne de caractères\"\n\n#: txt2regex.sh:375\nmsgid \"an allowed characters list\"\nmsgstr \"une liste de caractères autorisés\"\n\n#: txt2regex.sh:376\nmsgid \"a forbidden characters list\"\nmsgstr \"une liste de caractères interdits\"\n\n#: txt2regex.sh:377\nmsgid \"a special combination\"\nmsgstr \"une combinaison spéciale\"\n\n#: txt2regex.sh:378\nmsgid \"a POSIX combination (locale aware)\"\nmsgstr \"une combinaison POSIX (sujette à localisation)\"\n\n#: txt2regex.sh:379\nmsgid \"a ready regex (not implemented)\"\nmsgstr \"une regex prédéfinie (non implémenté)\"\n\n#: txt2regex.sh:380\nmsgid \"anything\"\nmsgstr \"n'importe quoi\"\n\n#: txt2regex.sh:396\nmsgid \"how many times (repetition)\"\nmsgstr \"nombre de fois (répétition)\"\n\n#: txt2regex.sh:397\nmsgid \"one\"\nmsgstr \"une exactement\"\n\n#: txt2regex.sh:398\nmsgid \"zero or one (optional)\"\nmsgstr \"zéro ou une (optionnel)\"\n\n#: txt2regex.sh:399\nmsgid \"zero or more\"\nmsgstr \"zéro ou plus\"\n\n#: txt2regex.sh:400\nmsgid \"one or more\"\nmsgstr \"une ou plus\"\n\n#: txt2regex.sh:401\nmsgid \"exactly N\"\nmsgstr \"exactement N\"\n\n#: txt2regex.sh:402\nmsgid \"up to N\"\nmsgstr \"jusqu'à N occurrences\"\n\n#: txt2regex.sh:403\nmsgid \"at least N\"\nmsgstr \"au moins N occurrences\"\n\n#: txt2regex.sh:408 txt2regex.sh:428\nmsgid \"uppercase letters\"\nmsgstr \"lettres majuscules\"\n\n#: txt2regex.sh:409 txt2regex.sh:427\nmsgid \"lowercase letters\"\nmsgstr \"lettres minuscules\"\n\n#: txt2regex.sh:410 txt2regex.sh:429\nmsgid \"numbers\"\nmsgstr \"nombres\"\n\n#: txt2regex.sh:411\nmsgid \"underscore\"\nmsgstr \"underscore\"\n\n#: txt2regex.sh:412\nmsgid \"space\"\nmsgstr \"espace\"\n\n#: txt2regex.sh:413\nmsgid \"TAB\"\nmsgstr \"TAB\"\n\n#: txt2regex.sh:426\nmsgid \"letters\"\nmsgstr \"lettres\"\n\n#: txt2regex.sh:430\nmsgid \"letters and numbers\"\nmsgstr \"lettres et nombres\"\n\n#: txt2regex.sh:431\nmsgid \"hexadecimal numbers\"\nmsgstr \"nombres hexadécimaux\"\n\n#: txt2regex.sh:432\nmsgid \"whitespaces (space and TAB)\"\nmsgstr \"blancs (espace et TAB)\"\n\n#: txt2regex.sh:433\nmsgid \"graphic chars (not-whitespace)\"\nmsgstr \"caractères graphiques (autres que blancs)\"\n\n#: txt2regex.sh:448\nmsgid \"quit\"\nmsgstr \"quitter\"\n\n#: txt2regex.sh:449\nmsgid \"reset\"\nmsgstr \"remise à zéro\"\n\n#: txt2regex.sh:450\nmsgid \"color\"\nmsgstr \"couleur\"\n\n#: txt2regex.sh:451\nmsgid \"programs\"\nmsgstr \"programmes\"\n\n#: txt2regex.sh:474\nmsgid \"or\"\nmsgstr \"ou\"\n\n#: txt2regex.sh:475\nmsgid \"open group\"\nmsgstr \"ouvrir groupe\"\n\n#: txt2regex.sh:476\nmsgid \"close group\"\nmsgstr \"fermer groupe\"\n\n#: txt2regex.sh:483\nmsgid \"not supported\"\nmsgstr \"non supporté\"\n\n#: txt2regex.sh:724\nmsgid \"NOTE: . [] [^] and * are the same on all programs.\"\nmsgstr \"NOTE : [] [^] et * sont identiques pour tous les programmes\"\n\n#: txt2regex.sh:735 txt2regex.sh:736\nmsgid \"NO\"\nmsgstr \"NON\"\n\n#: txt2regex.sh:748 txt2regex.sh:749\nmsgid \"YES\"\nmsgstr \"OUI\"\n\n#: txt2regex.sh:765\nmsgid \"program\"\nmsgstr \"programme\"\n\n#: txt2regex.sh:766\nmsgid \"metas\"\nmsgstr \"métas\"\n\n#: txt2regex.sh:767\nmsgid \"esc meta\"\nmsgstr \"esc méta\"\n\n#: txt2regex.sh:768\nmsgid \"need esc\"\nmsgstr \"esc nécessaire\"\n\n#: txt2regex.sh:769\nmsgid \"\\\\t in []\"\nmsgstr \"\\\\t dans []\"\n\n#: txt2regex.sh:823\nmsgid \"Your terminal has %d lines, but txt2regex needs at least %d lines.\"\nmsgstr \"\"\n\n#: txt2regex.sh:828\nmsgid \"Increase the number of lines or select less programs using --prog.\"\nmsgstr \"\"\n\n#: txt2regex.sh:829\nmsgid \"If this line number detection is incorrect, export the LINES variable.\"\nmsgstr \"\"\n\n#: txt2regex.sh:1027\nmsgid \"which one?\"\nmsgstr \"lequel ?\"\n\n#: txt2regex.sh:1043\nmsgid \"which?\"\nmsgstr \"lequel en particulier ?\"\n\n#: txt2regex.sh:1326\nmsgid \"exit\"\nmsgstr \"quitter\"\n\n#: txt2regex.sh:1327\nmsgid \"press the letters to (un)select the items\"\nmsgstr \"tapez les lettres pour (dé-)sélectionner les éléments\"\n\n#: txt2regex.sh:1505\nmsgid \"repeated\"\nmsgstr \"répété\"\n\n#: txt2regex.sh:1507\nmsgid \"times\"\nmsgstr \"fois\"\n\n#: txt2regex.sh:1516\nmsgid \"Really quit?\"\nmsgstr \"Quitter - êtes-vous sûr ?\"\n\n#: txt2regex.sh:1540\nmsgid \"no regex\"\nmsgstr \"pas de regex\"\n"
  },
  {
    "path": "po/id_ID.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: txt2regex 0.3\\n\"\n\"POT-Creation-Date: 2020-05-17 07:16 CEST\\n\"\n\"PO-Revision-Date: 2001-06-18 11:45+0700\\n\"\n\"Last-Translator: Muhamad Faizal <faizal@mfaizal.net>\\n\"\n\"Language: id_ID\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: txt2regex.sh:92\nmsgid \"ERROR\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:118 txt2regex.sh:120 txt2regex.sh:129\nmsgid \"PROGRAMS\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:114 txt2regex.sh:116 txt2regex.sh:118\n#: txt2regex.sh:120\nmsgid \"usage:\"\nmsgstr \"cara pemakaian:\"\n\n#: txt2regex.sh:116 txt2regex.sh:134\nmsgid \"PROGRAM\"\nmsgstr \"\"\n\n#: txt2regex.sh:118 txt2regex.sh:136\nmsgid \"VALUE\"\nmsgstr \"\"\n\n#: txt2regex.sh:120 txt2regex.sh:138\nmsgid \"LABEL\"\nmsgstr \"\"\n\n#: txt2regex.sh:122\nmsgid \"Options:\"\nmsgstr \"\"\n\n#: txt2regex.sh:124\nmsgid \"Select all the available programs\"\nmsgstr \"\"\n\n#: txt2regex.sh:126\nmsgid \"Do not use colors\"\nmsgstr \"\"\n\n#: txt2regex.sh:128\nmsgid \"Adjust colors for white background terminals\"\nmsgstr \"\"\n\n#: txt2regex.sh:130\nmsgid \"Specify which programs to use, separated by commas\"\nmsgstr \"\"\n\n#: txt2regex.sh:133\nmsgid \"Print a metacharacters table featuring all the programs\"\nmsgstr \"\"\n\n#: txt2regex.sh:135\nmsgid \"Print regex-related info about the specified program\"\nmsgstr \"\"\n\n#: txt2regex.sh:137\nmsgid \"Print a regex from the given history data\"\nmsgstr \"\"\n\n#: txt2regex.sh:139\nmsgid \"Print a ready regex for the specified label\"\nmsgstr \"\"\n\n#: txt2regex.sh:142\nmsgid \"Print the program version and quit\"\nmsgstr \"\"\n\n#: txt2regex.sh:144\nmsgid \"Print the help message and quit\"\nmsgstr \"\"\n\n#: txt2regex.sh:277\nmsgid \"unknown program\"\nmsgstr \"aplikasi tidak dikenal\"\n\n#: txt2regex.sh:305\nmsgid \"invalid argument\"\nmsgstr \"\"\n\n#: txt2regex.sh:306\nmsgid \"valid names:\"\nmsgstr \"\"\n\n#: txt2regex.sh:348\nmsgid \"invalid option\"\nmsgstr \"\"\n\n#: txt2regex.sh:360\nmsgid \"start to match\"\nmsgstr \"yang ingin ditemukan\"\n\n#: txt2regex.sh:361\nmsgid \"on the line beginning\"\nmsgstr \"di awal baris\"\n\n#: txt2regex.sh:362\nmsgid \"in any part of the line\"\nmsgstr \"di sembarang tempat\"\n\n#: txt2regex.sh:371\nmsgid \"followed by\"\nmsgstr \"diikuti oleh\"\n\n#: txt2regex.sh:372\nmsgid \"any character\"\nmsgstr \"sembarang karakter\"\n\n#: txt2regex.sh:373\nmsgid \"a specific character\"\nmsgstr \"karakter tertentu\"\n\n#: txt2regex.sh:374\nmsgid \"a literal string\"\nmsgstr \"kalimat\"\n\n#: txt2regex.sh:375\nmsgid \"an allowed characters list\"\nmsgstr \"daftar karakter yang dicari\"\n\n#: txt2regex.sh:376\nmsgid \"a forbidden characters list\"\nmsgstr \"daftar karakter yang tidak dicari\"\n\n#: txt2regex.sh:377\nmsgid \"a special combination\"\nmsgstr \"kombinasi khusus\"\n\n#: txt2regex.sh:378\nmsgid \"a POSIX combination (locale aware)\"\nmsgstr \"kombinasi POSIX (dapat memanfaatkan aplikasi locale)\"\n\n#: txt2regex.sh:379\nmsgid \"a ready regex (not implemented)\"\nmsgstr \"regex yang sudah ada (belum diimplementasikan)\"\n\n#: txt2regex.sh:380\nmsgid \"anything\"\nmsgstr \"apapun\"\n\n#: txt2regex.sh:396\nmsgid \"how many times (repetition)\"\nmsgstr \"banyaknya pengulangan\"\n\n#: txt2regex.sh:397\nmsgid \"one\"\nmsgstr \"satu\"\n\n#: txt2regex.sh:398\nmsgid \"zero or one (optional)\"\nmsgstr \"nol atau satu\"\n\n#: txt2regex.sh:399\nmsgid \"zero or more\"\nmsgstr \"lebih dari atau sama dengan nol\"\n\n#: txt2regex.sh:400\nmsgid \"one or more\"\nmsgstr \"lebih dari atau sama dengan satu\"\n\n#: txt2regex.sh:401\nmsgid \"exactly N\"\nmsgstr \"sejumlah N\"\n\n#: txt2regex.sh:402\nmsgid \"up to N\"\nmsgstr \"sampai dengan N\"\n\n#: txt2regex.sh:403\nmsgid \"at least N\"\nmsgstr \"paling sedikit N\"\n\n#: txt2regex.sh:408 txt2regex.sh:428\nmsgid \"uppercase letters\"\nmsgstr \"huruf kapital\"\n\n#: txt2regex.sh:409 txt2regex.sh:427\nmsgid \"lowercase letters\"\nmsgstr \"huruf biasa\"\n\n#: txt2regex.sh:410 txt2regex.sh:429\nmsgid \"numbers\"\nmsgstr \"bilangan\"\n\n#: txt2regex.sh:411\nmsgid \"underscore\"\nmsgstr \"garis bawah\"\n\n#: txt2regex.sh:412\nmsgid \"space\"\nmsgstr \"spasi\"\n\n#: txt2regex.sh:413\nmsgid \"TAB\"\nmsgstr \"TAB\"\n\n#: txt2regex.sh:426\nmsgid \"letters\"\nmsgstr \"huruf\"\n\n#: txt2regex.sh:430\nmsgid \"letters and numbers\"\nmsgstr \"huruf dan bilangan\"\n\n#: txt2regex.sh:431\nmsgid \"hexadecimal numbers\"\nmsgstr \"bilangan heksadesimal\"\n\n#: txt2regex.sh:432\nmsgid \"whitespaces (space and TAB)\"\nmsgstr \"spasi kosong (spasi dan TAB)\"\n\n#: txt2regex.sh:433\nmsgid \"graphic chars (not-whitespace)\"\nmsgstr \"karakter grafis (bukan spasi kosong)\"\n\n#: txt2regex.sh:448\nmsgid \"quit\"\nmsgstr \"keluar\"\n\n#: txt2regex.sh:449\nmsgid \"reset\"\nmsgstr \"reset\"\n\n#: txt2regex.sh:450\nmsgid \"color\"\nmsgstr \"warna\"\n\n#: txt2regex.sh:451\nmsgid \"programs\"\nmsgstr \"aplikasi\"\n\n#: txt2regex.sh:474\nmsgid \"or\"\nmsgstr \"atau\"\n\n#: txt2regex.sh:475\nmsgid \"open group\"\nmsgstr \"buka grup\"\n\n#: txt2regex.sh:476\nmsgid \"close group\"\nmsgstr \"tutup grup\"\n\n#: txt2regex.sh:483\nmsgid \"not supported\"\nmsgstr \"tidak didukung\"\n\n#: txt2regex.sh:724\nmsgid \"NOTE: . [] [^] and * are the same on all programs.\"\nmsgstr \"CATATAN: . [] [^] dan * sama untuk semua aplikasi.\"\n\n#: txt2regex.sh:735 txt2regex.sh:736\nmsgid \"NO\"\nmsgstr \"TIDAK\"\n\n#: txt2regex.sh:748 txt2regex.sh:749\nmsgid \"YES\"\nmsgstr \"YA\"\n\n#: txt2regex.sh:765\nmsgid \"program\"\nmsgstr \"aplikasi\"\n\n#: txt2regex.sh:766\nmsgid \"metas\"\nmsgstr \"karakter meta\"\n\n#: txt2regex.sh:767\nmsgid \"esc meta\"\nmsgstr \"karakter meta esc\"\n\n#: txt2regex.sh:768\nmsgid \"need esc\"\nmsgstr \"perlu karakter esc\"\n\n#: txt2regex.sh:769\nmsgid \"\\\\t in []\"\nmsgstr \"\\\\t di []\"\n\n#: txt2regex.sh:823\nmsgid \"Your terminal has %d lines, but txt2regex needs at least %d lines.\"\nmsgstr \"\"\n\n#: txt2regex.sh:828\nmsgid \"Increase the number of lines or select less programs using --prog.\"\nmsgstr \"\"\n\n#: txt2regex.sh:829\nmsgid \"If this line number detection is incorrect, export the LINES variable.\"\nmsgstr \"\"\n\n#: txt2regex.sh:1027\nmsgid \"which one?\"\nmsgstr \"yang mana?\"\n\n#: txt2regex.sh:1043\nmsgid \"which?\"\nmsgstr \"yang mana?\"\n\n#: txt2regex.sh:1326\nmsgid \"exit\"\nmsgstr \"keluar\"\n\n#: txt2regex.sh:1327\nmsgid \"press the letters to (un)select the items\"\nmsgstr \"tekan huruf untuk memilih aplikasi\"\n\n#: txt2regex.sh:1505\nmsgid \"repeated\"\nmsgstr \"pengulangan\"\n\n#: txt2regex.sh:1507\nmsgid \"times\"\nmsgstr \"kali\"\n\n#: txt2regex.sh:1516\nmsgid \"Really quit?\"\nmsgstr \"Anda yakin mau keluar?\"\n\n#: txt2regex.sh:1540\nmsgid \"no regex\"\nmsgstr \"tidak ada regex\"\n\n#~ msgid \"\"\n#~ \"usage: txt2regex [--nocolor|--whitebg|--all]\\n\"\n#~ \"       txt2regex --showmeta|--showinfo <program>\\n\"\n#~ \"       txt2regex [--all|--prog <p1,p2>] --make <target>\\n\"\n#~ \"       txt2regex --history <value>\\n\"\n#~ \"\\n\"\n#~ \"OPTIONS (they are default OFF):\\n\"\n#~ \"\\n\"\n#~ \"  --all                 works with all registered programs\\n\"\n#~ \"  --nocolor             self-explanatory\\n\"\n#~ \"  --whitebg             colors adjusted to white background terminals\\n\"\n#~ \"  --showmeta            prints a complete metachar table for all programs\\n\"\n#~ \"  --showinfo <program>  prints regex info about the program\\n\"\n#~ \"\\n\"\n#~ \"  --history <value>     prints to STDOUT a RegEx from a history data\\n\"\n#~ \"  --make <target>       prints a ready RegEx for a common pattern\\n\"\n#~ \"  --prog <p1,p2,...>    choose which programs to use (separated by commas)\\n\"\n#~ \"\\n\"\n#~ \"  --version             prints the program version and quit\\n\"\n#~ \"  --help                prints the help message and quit\\n\"\n#~ \"\\n\"\n#~ \"for more details about the options, read the README file.\"\n#~ msgstr \"\"\n#~ \"cara pemakaian: txt2regex [--nocolor|--whitebg|--all]\\n\"\n#~ \"                txt2regex --showmeta|--showinfo <program>\\n\"\n#~ \"                txt2regex --history <nilai>\\n\"\n#~ \"\\n\"\n#~ \"OPTIONS (secara default dimatikan / OFF):\\n\"\n#~ \"\\n\"\n#~ \"  --all                 kerjakan untuk semua program yang telah terdaftar\\n\"\n#~ \"  --nocolor             tanpa warna\\n\"\n#~ \"  --whitebg             warna disesuaikan dengan terminal berlatar belakang putih\\n\"\n#~ \"  --showmeta            prints a complete metachar table for all programs\\n\"\n#~ \"  --showinfo <program>  prints regex info about the program\\n\"\n#~ \"  --history <nilai>     cetak ke STDOUT sebuah RegEx yang sudah pernah dikerjakan\\n\"\n#~ \"\\n\"\n#~ \"  --version             prints the program version and quit\\n\"\n#~ \"  --help                prints the help message and quit\\n\"\n#~ \"\\n\"\n#~ \"untuk lebih jelas mengenai berbagai opsi di atas, bacalah file README.\"\n"
  },
  {
    "path": "po/it_IT.po",
    "content": "# Translator: Daniele Pizzolli\n# Revision  : Marco Pagnanini\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: txt2regex 0.7\\n\"\n\"POT-Creation-Date: 2020-05-17 07:16 CEST\\n\"\n\"PO-Revision-Date: 2003-02-20 13:24+0100\\n\"\n\"Last-Translator: Marco Pagnanini\\n\"\n\"Language: it_IT\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: KBabel 0.9.6\\n\"\n\n#: txt2regex.sh:92\nmsgid \"ERROR\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:118 txt2regex.sh:120 txt2regex.sh:129\nmsgid \"PROGRAMS\"\nmsgstr \"PROGRAMMI\"\n\n#: txt2regex.sh:112 txt2regex.sh:114 txt2regex.sh:116 txt2regex.sh:118\n#: txt2regex.sh:120\nmsgid \"usage:\"\nmsgstr \"uso:\"\n\n#: txt2regex.sh:116 txt2regex.sh:134\nmsgid \"PROGRAM\"\nmsgstr \"PROGRAMMA\"\n\n#: txt2regex.sh:118 txt2regex.sh:136\nmsgid \"VALUE\"\nmsgstr \"VALORE\"\n\n#: txt2regex.sh:120 txt2regex.sh:138\nmsgid \"LABEL\"\nmsgstr \"\"\n\n#: txt2regex.sh:122\nmsgid \"Options:\"\nmsgstr \"Opzioni:\"\n\n#: txt2regex.sh:124\nmsgid \"Select all the available programs\"\nmsgstr \"Funziona con tutti i programmi registrati\"\n\n#: txt2regex.sh:126\nmsgid \"Do not use colors\"\nmsgstr \"\"\n\n#: txt2regex.sh:128\nmsgid \"Adjust colors for white background terminals\"\nmsgstr \"Colori adatti per lo sfondo bianco\"\n\n#: txt2regex.sh:130\nmsgid \"Specify which programs to use, separated by commas\"\nmsgstr \"Sceglie quali programmi usare, separati da virgole\"\n\n#: txt2regex.sh:133\nmsgid \"Print a metacharacters table featuring all the programs\"\nmsgstr \"Stampa una tabella completa dei metacaratteri per ogni programma\"\n\n#: txt2regex.sh:135\nmsgid \"Print regex-related info about the specified program\"\nmsgstr \"Stampa delle informazioni sulle regex del programma\"\n\n#: txt2regex.sh:137\nmsgid \"Print a regex from the given history data\"\nmsgstr \"Stampa la regex presa dalla history\"\n\n#: txt2regex.sh:139\nmsgid \"Print a ready regex for the specified label\"\nmsgstr \"Stampa una regex da una espressione comune\"\n\n#: txt2regex.sh:142\nmsgid \"Print the program version and quit\"\nmsgstr \"Stampa la versione del programma ed esce\"\n\n#: txt2regex.sh:144\nmsgid \"Print the help message and quit\"\nmsgstr \"Stampa il messaggio d'aiuto ed esce\"\n\n#: txt2regex.sh:277\nmsgid \"unknown program\"\nmsgstr \"programma sconosciuto\"\n\n#: txt2regex.sh:305\nmsgid \"invalid argument\"\nmsgstr \"argomento non corretto\"\n\n#: txt2regex.sh:306\nmsgid \"valid names:\"\nmsgstr \"nomi validi:\"\n\n#: txt2regex.sh:348\nmsgid \"invalid option\"\nmsgstr \"opzione non corretta\"\n\n# ???\n# ricerca della corrispondenza?\n#: txt2regex.sh:360\nmsgid \"start to match\"\nmsgstr \"inizia la ricerca\"\n\n#: txt2regex.sh:361\nmsgid \"on the line beginning\"\nmsgstr \"all'inizio della riga\"\n\n#: txt2regex.sh:362\nmsgid \"in any part of the line\"\nmsgstr \"in qualsiasi parte della riga\"\n\n# continua con è meglio di seguito da perché va bene per M e F\n#: txt2regex.sh:371\nmsgid \"followed by\"\nmsgstr \"continua con\"\n\n#: txt2regex.sh:372\nmsgid \"any character\"\nmsgstr \"un qualsiasi carattere\"\n\n#: txt2regex.sh:373\nmsgid \"a specific character\"\nmsgstr \"un carattere specifico\"\n\n# this means that . becomes \\. and $ becomes \\$ in vim  or not?\n# I don't understand or this is a bug!\n# da inserire letteralmente???\n#: txt2regex.sh:374\nmsgid \"a literal string\"\nmsgstr \"una stringa da interpretare letteralmente\"\n\n#: txt2regex.sh:375\nmsgid \"an allowed characters list\"\nmsgstr \"una lista di caratteri ammessi\"\n\n#: txt2regex.sh:376\nmsgid \"a forbidden characters list\"\nmsgstr \"una lista di caratteri non ammessi\"\n\n#: txt2regex.sh:377\nmsgid \"a special combination\"\nmsgstr \"una combinazione speciale\"\n\n#: txt2regex.sh:378\nmsgid \"a POSIX combination (locale aware)\"\nmsgstr \"una combinazione POSIX (tiene conto delle impostazioni locali)\"\n\n#: txt2regex.sh:379\nmsgid \"a ready regex (not implemented)\"\nmsgstr \"una regex pronta (non ancora implementato)\"\n\n#: txt2regex.sh:380\nmsgid \"anything\"\nmsgstr \"qualsiasi cosa\"\n\n#: txt2regex.sh:396\nmsgid \"how many times (repetition)\"\nmsgstr \"quante volte deve essere ripetuta\"\n\n#: txt2regex.sh:397\nmsgid \"one\"\nmsgstr \"una\"\n\n#: txt2regex.sh:398\nmsgid \"zero or one (optional)\"\nmsgstr \"zero o una (opzionale)\"\n\n#: txt2regex.sh:399\nmsgid \"zero or more\"\nmsgstr \"zero o più\"\n\n#: txt2regex.sh:400\nmsgid \"one or more\"\nmsgstr \"una o più\"\n\n#: txt2regex.sh:401\nmsgid \"exactly N\"\nmsgstr \"esattamente N\"\n\n#: txt2regex.sh:402\nmsgid \"up to N\"\nmsgstr \"al minimo N\"\n\n#: txt2regex.sh:403\nmsgid \"at least N\"\nmsgstr \"al massimo N\"\n\n#: txt2regex.sh:408 txt2regex.sh:428\nmsgid \"uppercase letters\"\nmsgstr \"lettere maiuscole\"\n\n#: txt2regex.sh:409 txt2regex.sh:427\nmsgid \"lowercase letters\"\nmsgstr \"lettere minuscole\"\n\n#: txt2regex.sh:410 txt2regex.sh:429\nmsgid \"numbers\"\nmsgstr \"numeri\"\n\n#: txt2regex.sh:411\nmsgid \"underscore\"\nmsgstr \"trattino basso (underscore)\"\n\n#: txt2regex.sh:412\nmsgid \"space\"\nmsgstr \"spazio\"\n\n#: txt2regex.sh:413\nmsgid \"TAB\"\nmsgstr \"TAB\"\n\n#: txt2regex.sh:426\nmsgid \"letters\"\nmsgstr \"lettere\"\n\n#: txt2regex.sh:430\nmsgid \"letters and numbers\"\nmsgstr \"lettere e numeri\"\n\n#: txt2regex.sh:431\nmsgid \"hexadecimal numbers\"\nmsgstr \"numeri esadecimali\"\n\n#: txt2regex.sh:432\nmsgid \"whitespaces (space and TAB)\"\nmsgstr \"spazi bianchi (spazio e TAB)\"\n\n#: txt2regex.sh:433\nmsgid \"graphic chars (not-whitespace)\"\nmsgstr \"caratteri grafici (cioè non spazi bianchi)\"\n\n#: txt2regex.sh:448\nmsgid \"quit\"\nmsgstr \"esci\"\n\n#: txt2regex.sh:449\nmsgid \"reset\"\nmsgstr \"riparti\"\n\n#: txt2regex.sh:450\nmsgid \"color\"\nmsgstr \"colore\"\n\n#: txt2regex.sh:451\nmsgid \"programs\"\nmsgstr \"programma\"\n\n#: txt2regex.sh:474\nmsgid \"or\"\nmsgstr \"o\"\n\n#: txt2regex.sh:475\nmsgid \"open group\"\nmsgstr \"apri gruppo (o)\"\n\n#: txt2regex.sh:476\nmsgid \"close group\"\nmsgstr \"chiudi gruppo\"\n\n#: txt2regex.sh:483\nmsgid \"not supported\"\nmsgstr \"non supportato\"\n\n# are the same or have the same meaning\n# o hanno lo stesso significato ???\n#: txt2regex.sh:724\nmsgid \"NOTE: . [] [^] and * are the same on all programs.\"\nmsgstr \"NOTA: . [] [^] e * sono le stesse in ogni programma.\"\n\n#: txt2regex.sh:735 txt2regex.sh:736\nmsgid \"NO\"\nmsgstr \"NO\"\n\n#: txt2regex.sh:748 txt2regex.sh:749\nmsgid \"YES\"\nmsgstr \"Sì\"\n\n#: txt2regex.sh:765\nmsgid \"program\"\nmsgstr \"programma\"\n\n#: txt2regex.sh:766\nmsgid \"metas\"\nmsgstr \"meta caratteri\"\n\n#: txt2regex.sh:767\nmsgid \"esc meta\"\nmsgstr \"carattere esc\"\n\n#: txt2regex.sh:768\nmsgid \"need esc\"\nmsgstr \"abbisognano di esc\"\n\n#: txt2regex.sh:769\nmsgid \"\\\\t in []\"\nmsgstr \"\\\\t in []\"\n\n#: txt2regex.sh:823\nmsgid \"Your terminal has %d lines, but txt2regex needs at least %d lines.\"\nmsgstr \"\"\n\n#: txt2regex.sh:828\nmsgid \"Increase the number of lines or select less programs using --prog.\"\nmsgstr \"\"\n\n#: txt2regex.sh:829\nmsgid \"If this line number detection is incorrect, export the LINES variable.\"\nmsgstr \"\"\n\n#: txt2regex.sh:1027\nmsgid \"which one?\"\nmsgstr \"Quale?\"\n\n#: txt2regex.sh:1043\nmsgid \"which?\"\nmsgstr \"Quale?\"\n\n#: txt2regex.sh:1326\nmsgid \"exit\"\nmsgstr \"uscita\"\n\n#: txt2regex.sh:1327\nmsgid \"press the letters to (un)select the items\"\nmsgstr \"premi le lettere per (de)selezionare i programmi corrispondenti\"\n\n# solo per perché altrimenti bisogna tenere conto di M, F, S e P\n#: txt2regex.sh:1505\nmsgid \"repeated\"\nmsgstr \"per\"\n\n#: txt2regex.sh:1507\nmsgid \"times\"\nmsgstr \"volte\"\n\n#: txt2regex.sh:1516\nmsgid \"Really quit?\"\nmsgstr \"Vuoi veramente uscire?\"\n\n#: txt2regex.sh:1540\nmsgid \"no regex\"\nmsgstr \"nessuna regex\"\n"
  },
  {
    "path": "po/ja.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: txt2regex 0.6\\n\"\n\"POT-Creation-Date: 2020-05-17 07:16 CEST\\n\"\n\"PO-Revision-Date: 2001-09-15 10:53+0900\\n\"\n\"Last-Translator: Koichi OIKE <daichi1@gol.com>\\n\"\n\"Language: ja\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: txt2regex.sh:92\nmsgid \"ERROR\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:118 txt2regex.sh:120 txt2regex.sh:129\nmsgid \"PROGRAMS\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:114 txt2regex.sh:116 txt2regex.sh:118\n#: txt2regex.sh:120\nmsgid \"usage:\"\nmsgstr \"\"\n\n#: txt2regex.sh:116 txt2regex.sh:134\nmsgid \"PROGRAM\"\nmsgstr \"\"\n\n#: txt2regex.sh:118 txt2regex.sh:136\nmsgid \"VALUE\"\nmsgstr \"\"\n\n#: txt2regex.sh:120 txt2regex.sh:138\nmsgid \"LABEL\"\nmsgstr \"\"\n\n#: txt2regex.sh:122\nmsgid \"Options:\"\nmsgstr \"\"\n\n#: txt2regex.sh:124\nmsgid \"Select all the available programs\"\nmsgstr \"\"\n\n#: txt2regex.sh:126\nmsgid \"Do not use colors\"\nmsgstr \"\"\n\n#: txt2regex.sh:128\nmsgid \"Adjust colors for white background terminals\"\nmsgstr \"\"\n\n#: txt2regex.sh:130\nmsgid \"Specify which programs to use, separated by commas\"\nmsgstr \"\"\n\n#: txt2regex.sh:133\nmsgid \"Print a metacharacters table featuring all the programs\"\nmsgstr \"\"\n\n#: txt2regex.sh:135\nmsgid \"Print regex-related info about the specified program\"\nmsgstr \"\"\n\n#: txt2regex.sh:137\nmsgid \"Print a regex from the given history data\"\nmsgstr \"\"\n\n#: txt2regex.sh:139\nmsgid \"Print a ready regex for the specified label\"\nmsgstr \"\"\n\n#: txt2regex.sh:142\nmsgid \"Print the program version and quit\"\nmsgstr \"\"\n\n#: txt2regex.sh:144\nmsgid \"Print the help message and quit\"\nmsgstr \"\"\n\n#: txt2regex.sh:277\nmsgid \"unknown program\"\nmsgstr \"\"\n\n#: txt2regex.sh:305\nmsgid \"invalid argument\"\nmsgstr \"\"\n\n#: txt2regex.sh:306\nmsgid \"valid names:\"\nmsgstr \"\"\n\n#: txt2regex.sh:348\nmsgid \"invalid option\"\nmsgstr \"\"\n\n#: txt2regex.sh:360\nmsgid \"start to match\"\nmsgstr \"マッチを始めるのは\"\n\n#: txt2regex.sh:361\nmsgid \"on the line beginning\"\nmsgstr \"行の先頭から\"\n\n#: txt2regex.sh:362\nmsgid \"in any part of the line\"\nmsgstr \"行の任意の部分から\"\n\n#: txt2regex.sh:371\nmsgid \"followed by\"\nmsgstr \"それに続いて\"\n\n#: txt2regex.sh:372\nmsgid \"any character\"\nmsgstr \"任意の文字\"\n\n#: txt2regex.sh:373\nmsgid \"a specific character\"\nmsgstr \"(そのままの)文字\"\n\n#: txt2regex.sh:374\nmsgid \"a literal string\"\nmsgstr \"(そのままの)文字列\"\n\n#: txt2regex.sh:375\nmsgid \"an allowed characters list\"\nmsgstr \"文字クラス\"\n\n#: txt2regex.sh:376\nmsgid \"a forbidden characters list\"\nmsgstr \"否定文字クラス\"\n\n#: txt2regex.sh:377\nmsgid \"a special combination\"\nmsgstr \"特定の文字の組合せ\"\n\n#: txt2regex.sh:378\nmsgid \"a POSIX combination (locale aware)\"\nmsgstr \"POSIX文字クラス(ロケール対応)\"\n\n#: txt2regex.sh:379\nmsgid \"a ready regex (not implemented)\"\nmsgstr \"準備済みの正規表現(未実装)\"\n\n#: txt2regex.sh:380\nmsgid \"anything\"\nmsgstr \"(0文字以上の)任意の文字列\"\n\n#: txt2regex.sh:396\nmsgid \"how many times (repetition)\"\nmsgstr \"何回繰り返しますか\"\n\n#: txt2regex.sh:397\nmsgid \"one\"\nmsgstr \"1\"\n\n#: txt2regex.sh:398\nmsgid \"zero or one (optional)\"\nmsgstr \"0または1\"\n\n#: txt2regex.sh:399\nmsgid \"zero or more\"\nmsgstr \"少なくとも0\"\n\n#: txt2regex.sh:400\nmsgid \"one or more\"\nmsgstr \"少なくとも1\"\n\n#: txt2regex.sh:401\nmsgid \"exactly N\"\nmsgstr \"正確にN\"\n\n#: txt2regex.sh:402\nmsgid \"up to N\"\nmsgstr \"1からN\"\n\n#: txt2regex.sh:403\nmsgid \"at least N\"\nmsgstr \"少なくともN\"\n\n#: txt2regex.sh:408 txt2regex.sh:428\nmsgid \"uppercase letters\"\nmsgstr \"大文字アルファベット\"\n\n#: txt2regex.sh:409 txt2regex.sh:427\nmsgid \"lowercase letters\"\nmsgstr \"小文字アルファベット\"\n\n#: txt2regex.sh:410 txt2regex.sh:429\nmsgid \"numbers\"\nmsgstr \"数字\"\n\n#: txt2regex.sh:411\nmsgid \"underscore\"\nmsgstr \"下線(_)\"\n\n#: txt2regex.sh:412\nmsgid \"space\"\nmsgstr \"スペース\"\n\n#: txt2regex.sh:413\nmsgid \"TAB\"\nmsgstr \"タブ\"\n\n#: txt2regex.sh:426\nmsgid \"letters\"\nmsgstr \"アルファベット\"\n\n#: txt2regex.sh:430\nmsgid \"letters and numbers\"\nmsgstr \"アルファベットと数字\"\n\n#: txt2regex.sh:431\nmsgid \"hexadecimal numbers\"\nmsgstr \"16進数字\"\n\n#: txt2regex.sh:432\nmsgid \"whitespaces (space and TAB)\"\nmsgstr \"空白文字(スペースとタブ)\"\n\n#: txt2regex.sh:433\nmsgid \"graphic chars (not-whitespace)\"\nmsgstr \"非空白文字\"\n\n#: txt2regex.sh:448\nmsgid \"quit\"\nmsgstr \"終了\"\n\n#: txt2regex.sh:449\nmsgid \"reset\"\nmsgstr \"リセット\"\n\n#: txt2regex.sh:450\nmsgid \"color\"\nmsgstr \"色\"\n\n#: txt2regex.sh:451\nmsgid \"programs\"\nmsgstr \"プログラム\"\n\n#: txt2regex.sh:474\nmsgid \"or\"\nmsgstr \"または\"\n\n#: txt2regex.sh:475\nmsgid \"open group\"\nmsgstr \"グループ化開始\"\n\n#: txt2regex.sh:476\nmsgid \"close group\"\nmsgstr \"グループ化終了\"\n\n#: txt2regex.sh:483\nmsgid \"not supported\"\nmsgstr \"未サポート部分\"\n\n#: txt2regex.sh:724\nmsgid \"NOTE: . [] [^] and * are the same on all programs.\"\nmsgstr \"\"\n\n#: txt2regex.sh:735 txt2regex.sh:736\nmsgid \"NO\"\nmsgstr \"\"\n\n#: txt2regex.sh:748 txt2regex.sh:749\nmsgid \"YES\"\nmsgstr \"\"\n\n#: txt2regex.sh:765\nmsgid \"program\"\nmsgstr \"\"\n\n#: txt2regex.sh:766\nmsgid \"metas\"\nmsgstr \"\"\n\n#: txt2regex.sh:767\nmsgid \"esc meta\"\nmsgstr \"\"\n\n#: txt2regex.sh:768\nmsgid \"need esc\"\nmsgstr \"\"\n\n#: txt2regex.sh:769\nmsgid \"\\\\t in []\"\nmsgstr \"\"\n\n#: txt2regex.sh:823\nmsgid \"Your terminal has %d lines, but txt2regex needs at least %d lines.\"\nmsgstr \"\"\n\n#: txt2regex.sh:828\nmsgid \"Increase the number of lines or select less programs using --prog.\"\nmsgstr \"\"\n\n#: txt2regex.sh:829\nmsgid \"If this line number detection is incorrect, export the LINES variable.\"\nmsgstr \"\"\n\n#: txt2regex.sh:1027\nmsgid \"which one?\"\nmsgstr \"どの文字?\"\n\n#: txt2regex.sh:1043\nmsgid \"which?\"\nmsgstr \"どのような?\"\n\n#: txt2regex.sh:1326\nmsgid \"exit\"\nmsgstr \"戻る\"\n\n#: txt2regex.sh:1327\nmsgid \"press the letters to (un)select the items\"\nmsgstr \"文字を入力して項目を選択(解除)してください\"\n\n#: txt2regex.sh:1505\nmsgid \"repeated\"\nmsgstr \"繰り返しは\"\n\n#: txt2regex.sh:1507\nmsgid \"times\"\nmsgstr \"回\"\n\n#: txt2regex.sh:1516\nmsgid \"Really quit?\"\nmsgstr \"\"\n\n#: txt2regex.sh:1540\nmsgid \"no regex\"\nmsgstr \"正規表現はありません\"\n"
  },
  {
    "path": "po/pl_PL.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: txt2regex 0.5\\n\"\n\"POT-Creation-Date: 2020-05-17 07:16 CEST\\n\"\n\"PO-Revision-Date: 2001-08-28 10:43-0300\\n\"\n\"Last-Translator: Chris Piechowicz <chris_piechowicz@hotmail.com>\\n\"\n\"Language: pl_PL\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: txt2regex.sh:92\nmsgid \"ERROR\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:118 txt2regex.sh:120 txt2regex.sh:129\nmsgid \"PROGRAMS\"\nmsgstr \"PROGRAMY\"\n\n#: txt2regex.sh:112 txt2regex.sh:114 txt2regex.sh:116 txt2regex.sh:118\n#: txt2regex.sh:120\nmsgid \"usage:\"\nmsgstr \"użycie:\"\n\n#: txt2regex.sh:116 txt2regex.sh:134\nmsgid \"PROGRAM\"\nmsgstr \"PROGRAM\"\n\n#: txt2regex.sh:118 txt2regex.sh:136\nmsgid \"VALUE\"\nmsgstr \"WARTOŚĆ\"\n\n#: txt2regex.sh:120 txt2regex.sh:138\nmsgid \"LABEL\"\nmsgstr \"ETYKIETA\"\n\n#: txt2regex.sh:122\nmsgid \"Options:\"\nmsgstr \"Opcje:\"\n\n#: txt2regex.sh:124\nmsgid \"Select all the available programs\"\nmsgstr \"Działanie ze wszystkimi zarejestrowanymi programami\"\n\n#: txt2regex.sh:126\nmsgid \"Do not use colors\"\nmsgstr \"Nie używaj kolorów\"\n\n#: txt2regex.sh:128\nmsgid \"Adjust colors for white background terminals\"\nmsgstr \"Kolory skalibrowane dla terminali o białym tle\"\n\n#: txt2regex.sh:130\nmsgid \"Specify which programs to use, separated by commas\"\nmsgstr \"Wybierz których programów chcesz użyć, oddziel przecinkami\"\n\n#: txt2regex.sh:133\nmsgid \"Print a metacharacters table featuring all the programs\"\nmsgstr \"Wyświetla tabelę metacharakterów dla wszystkich programów\"\n\n#: txt2regex.sh:135\nmsgid \"Print regex-related info about the specified program\"\nmsgstr \"Wyświetla regex dla określonego programu\"\n\n#: txt2regex.sh:137\nmsgid \"Print a regex from the given history data\"\nmsgstr \"Wyświetla regex z danych danych z historii\"\n\n#: txt2regex.sh:139\nmsgid \"Print a ready regex for the specified label\"\nmsgstr \"Wyświetla domyślny regex dla wyszczególnionej etykiety\"\n\n#: txt2regex.sh:142\nmsgid \"Print the program version and quit\"\nmsgstr \"Wyświetla wersję programu i zamyka go\"\n\n#: txt2regex.sh:144\nmsgid \"Print the help message and quit\"\nmsgstr \"Wyświetla pomoc i zamyka program\"\n\n#: txt2regex.sh:277\nmsgid \"unknown program\"\nmsgstr \"nieznany program\"\n\n#: txt2regex.sh:305\nmsgid \"invalid argument\"\nmsgstr \"błędny argument\"\n\n#: txt2regex.sh:306\n#, fuzzy\nmsgid \"valid names:\"\nmsgstr \"właściwe nazwy to:\"\n\n#: txt2regex.sh:348\nmsgid \"invalid option\"\nmsgstr \"błędna opcja\"\n\n#: txt2regex.sh:360\nmsgid \"start to match\"\nmsgstr \"Zacznij dopasowywać\"\n\n#: txt2regex.sh:361\nmsgid \"on the line beginning\"\nmsgstr \"na początku linii\"\n\n#: txt2regex.sh:362\nmsgid \"in any part of the line\"\nmsgstr \"w jakikolwiek częci lini\"\n\n#: txt2regex.sh:371\nmsgid \"followed by\"\nmsgstr \"przed\"\n\n#: txt2regex.sh:372\nmsgid \"any character\"\nmsgstr \"jakikolwiek znak\"\n\n#: txt2regex.sh:373\nmsgid \"a specific character\"\nmsgstr \"konkretny znak\"\n\n#: txt2regex.sh:374\nmsgid \"a literal string\"\nmsgstr \"literał łańcuchowy ()\"\n\n#: txt2regex.sh:375\nmsgid \"an allowed characters list\"\nmsgstr \"lista dozwolonych znaków\"\n\n#: txt2regex.sh:376\nmsgid \"a forbidden characters list\"\nmsgstr \"lista niedozwolonych znaków\"\n\n#: txt2regex.sh:377\nmsgid \"a special combination\"\nmsgstr \"specjalna kombinacja\"\n\n#: txt2regex.sh:378\nmsgid \"a POSIX combination (locale aware)\"\nmsgstr \"POSIX kombinacja (świadoma lokalizacja)\"\n\n#: txt2regex.sh:379\nmsgid \"a ready regex (not implemented)\"\nmsgstr \"gotowy regex (nie zaimplementowana)\"\n\n#: txt2regex.sh:380\nmsgid \"anything\"\nmsgstr \"cokolwiek\"\n\n#: txt2regex.sh:396\nmsgid \"how many times (repetition)\"\nmsgstr \"ile razy\"\n\n#: txt2regex.sh:397\nmsgid \"one\"\nmsgstr \"jeden\"\n\n#: txt2regex.sh:398\nmsgid \"zero or one (optional)\"\nmsgstr \"zero albo jeden (nieobowiązkowe)\"\n\n#: txt2regex.sh:399\nmsgid \"zero or more\"\nmsgstr \"zero albo więcej\"\n\n#: txt2regex.sh:400\nmsgid \"one or more\"\nmsgstr \"jeden albo więcej\"\n\n#: txt2regex.sh:401\nmsgid \"exactly N\"\nmsgstr \"dokładnie N\"\n\n#: txt2regex.sh:402\nmsgid \"up to N\"\nmsgstr \"aż do N\"\n\n#: txt2regex.sh:403\nmsgid \"at least N\"\nmsgstr \"przynajmniej N\"\n\n#: txt2regex.sh:408 txt2regex.sh:428\nmsgid \"uppercase letters\"\nmsgstr \"duże litery\"\n\n#: txt2regex.sh:409 txt2regex.sh:427\nmsgid \"lowercase letters\"\nmsgstr \"małe litery\"\n\n#: txt2regex.sh:410 txt2regex.sh:429\nmsgid \"numbers\"\nmsgstr \"cyfry\"\n\n#: txt2regex.sh:411\nmsgid \"underscore\"\nmsgstr \"podkreślenie\"\n\n#: txt2regex.sh:412\nmsgid \"space\"\nmsgstr \"odstęp\"\n\n#: txt2regex.sh:413\nmsgid \"TAB\"\nmsgstr \"tabulator\"\n\n#: txt2regex.sh:426\nmsgid \"letters\"\nmsgstr \"litery\"\n\n#: txt2regex.sh:430\nmsgid \"letters and numbers\"\nmsgstr \"litery i cyfry\"\n\n#: txt2regex.sh:431\nmsgid \"hexadecimal numbers\"\nmsgstr \"numery hexadecimalne\"\n\n#: txt2regex.sh:432\nmsgid \"whitespaces (space and TAB)\"\nmsgstr \"niewidoczne odstępy (odstęp i tabulator)\"\n\n#: txt2regex.sh:433\nmsgid \"graphic chars (not-whitespace)\"\nmsgstr \"znaki graficzne (widoczne)\"\n\n#: txt2regex.sh:448\nmsgid \"quit\"\nmsgstr \"zamknij\"\n\n#: txt2regex.sh:449\nmsgid \"reset\"\nmsgstr \"zresetuj\"\n\n#: txt2regex.sh:450\nmsgid \"color\"\nmsgstr \"kolor\"\n\n#: txt2regex.sh:451\nmsgid \"programs\"\nmsgstr \"programy\"\n\n#: txt2regex.sh:474\nmsgid \"or\"\nmsgstr \"albo\"\n\n#: txt2regex.sh:475\nmsgid \"open group\"\nmsgstr \"otwórz grupę\"\n\n#: txt2regex.sh:476\nmsgid \"close group\"\nmsgstr \"zamknij grupę\"\n\n#: txt2regex.sh:483\nmsgid \"not supported\"\nmsgstr \"nieobsługiwane\"\n\n#: txt2regex.sh:724\nmsgid \"NOTE: . [] [^] and * are the same on all programs.\"\nmsgstr \"UWAGA: . [] [^] i * są takie same w każdym programie\"\n\n#: txt2regex.sh:735 txt2regex.sh:736\nmsgid \"NO\"\nmsgstr \"NIE\"\n\n#: txt2regex.sh:748 txt2regex.sh:749\nmsgid \"YES\"\nmsgstr \"TAK\"\n\n#: txt2regex.sh:765\nmsgid \"program\"\nmsgstr \"program\"\n\n#: txt2regex.sh:766\nmsgid \"metas\"\nmsgstr \"znaki meta\"\n\n#: txt2regex.sh:767\nmsgid \"esc meta\"\nmsgstr \"ESC\"\n\n#: txt2regex.sh:768\nmsgid \"need esc\"\nmsgstr \"potrzeba ESC\"\n\n#: txt2regex.sh:769\nmsgid \"\\\\t in []\"\nmsgstr \"\\\\t w []\"\n\n#: txt2regex.sh:823\nmsgid \"Your terminal has %d lines, but txt2regex needs at least %d lines.\"\nmsgstr \"\"\n\n#: txt2regex.sh:828\nmsgid \"Increase the number of lines or select less programs using --prog.\"\nmsgstr \"\"\n\n#: txt2regex.sh:829\nmsgid \"If this line number detection is incorrect, export the LINES variable.\"\nmsgstr \"\"\n\n#: txt2regex.sh:1027\nmsgid \"which one?\"\nmsgstr \"który?\"\n\n#: txt2regex.sh:1043\nmsgid \"which?\"\nmsgstr \"które?\"\n\n#: txt2regex.sh:1326\nmsgid \"exit\"\nmsgstr \"wyjdź\"\n\n#: txt2regex.sh:1327\nmsgid \"press the letters to (un)select the items\"\nmsgstr \"naciśnij klawisz żeby anulować wybór programu\"\n\n#: txt2regex.sh:1505\nmsgid \"repeated\"\nmsgstr \"powtarzane\"\n\n#: txt2regex.sh:1507\nmsgid \"times\"\nmsgstr \"razy\"\n\n#: txt2regex.sh:1516\nmsgid \"Really quit?\"\nmsgstr \"Na pewno chcesz wyjść ?\"\n\n#: txt2regex.sh:1540\nmsgid \"no regex\"\nmsgstr \"nie regex\"\n"
  },
  {
    "path": "po/pt_BR.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: txt2regex 0.6\\n\"\n\"POT-Creation-Date: 2020-05-17 07:16 CEST\\n\"\n\"PO-Revision-Date: 2001-09-03 18:43-0300\\n\"\n\"Last-Translator: Aurelio Jargas <verde@aurelio.net>\\n\"\n\"Language: pt_BR\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8BIT\\n\"\n\n#: txt2regex.sh:92\nmsgid \"ERROR\"\nmsgstr \"ERRO\"\n\n#: txt2regex.sh:112 txt2regex.sh:118 txt2regex.sh:120 txt2regex.sh:129\nmsgid \"PROGRAMS\"\nmsgstr \"PROGRAMAS\"\n\n#: txt2regex.sh:112 txt2regex.sh:114 txt2regex.sh:116 txt2regex.sh:118\n#: txt2regex.sh:120\nmsgid \"usage:\"\nmsgstr \"uso:\"\n\n#: txt2regex.sh:116 txt2regex.sh:134\nmsgid \"PROGRAM\"\nmsgstr \"PROGRAMA\"\n\n#: txt2regex.sh:118 txt2regex.sh:136\nmsgid \"VALUE\"\nmsgstr \"VALOR\"\n\n#: txt2regex.sh:120 txt2regex.sh:138\nmsgid \"LABEL\"\nmsgstr \"NOME\"\n\n#: txt2regex.sh:122\nmsgid \"Options:\"\nmsgstr \"Opções:\"\n\n#: txt2regex.sh:124\nmsgid \"Select all the available programs\"\nmsgstr \"Ativa todos os programas disponíveis\"\n\n#: txt2regex.sh:126\nmsgid \"Do not use colors\"\nmsgstr \"Não usar cores\"\n\n#: txt2regex.sh:128\nmsgid \"Adjust colors for white background terminals\"\nmsgstr \"Ajuste as cores para terminais de fundo branco\"\n\n#: txt2regex.sh:130\nmsgid \"Specify which programs to use, separated by commas\"\nmsgstr \"Informe quais programas usar, separados por vírgulas\"\n\n#: txt2regex.sh:133\nmsgid \"Print a metacharacters table featuring all the programs\"\nmsgstr \"Mostre uma tabela com os metacaracteres de todos os programas\"\n\n#: txt2regex.sh:135\nmsgid \"Print regex-related info about the specified program\"\nmsgstr \"Mostra informações sobre o programa informado\"\n\n#: txt2regex.sh:137\nmsgid \"Print a regex from the given history data\"\nmsgstr \"Mostra uma regex a partir dos dados de histórico informados\"\n\n#: txt2regex.sh:139\nmsgid \"Print a ready regex for the specified label\"\nmsgstr \"Mostra uma regex já pronta\"\n\n#: txt2regex.sh:142\nmsgid \"Print the program version and quit\"\nmsgstr \"Mostra a versão do programa e sai\"\n\n#: txt2regex.sh:144\nmsgid \"Print the help message and quit\"\nmsgstr \"Mostra a mensagem de ajuda e sai\"\n\n#: txt2regex.sh:277\nmsgid \"unknown program\"\nmsgstr \"programa desconhecido\"\n\n#: txt2regex.sh:305\nmsgid \"invalid argument\"\nmsgstr \"argumento inválido\"\n\n#: txt2regex.sh:306\nmsgid \"valid names:\"\nmsgstr \"nomes válidos:\"\n\n#: txt2regex.sh:348\nmsgid \"invalid option\"\nmsgstr \"opção inválida\"\n\n#: txt2regex.sh:360\nmsgid \"start to match\"\nmsgstr \"comece a casar a partir\"\n\n#: txt2regex.sh:361\nmsgid \"on the line beginning\"\nmsgstr \"do começo da linha\"\n\n#: txt2regex.sh:362\nmsgid \"in any part of the line\"\nmsgstr \"de qualquer lugar da linha\"\n\n#: txt2regex.sh:371\nmsgid \"followed by\"\nmsgstr \"seguido de\"\n\n#: txt2regex.sh:372\nmsgid \"any character\"\nmsgstr \"um caractere qualquer\"\n\n#: txt2regex.sh:373\nmsgid \"a specific character\"\nmsgstr \"um caractere específico\"\n\n#: txt2regex.sh:374\nmsgid \"a literal string\"\nmsgstr \"uma cadeia de caracteres literais\"\n\n#: txt2regex.sh:375\nmsgid \"an allowed characters list\"\nmsgstr \"uma lista de caracteres permitidos\"\n\n#: txt2regex.sh:376\nmsgid \"a forbidden characters list\"\nmsgstr \"uma lista de caracteres proibidos\"\n\n#: txt2regex.sh:377\nmsgid \"a special combination\"\nmsgstr \"uma combinação especial\"\n\n#: txt2regex.sh:378\nmsgid \"a POSIX combination (locale aware)\"\nmsgstr \"uma combinação POSIX (inclui acentuação)\"\n\n#: txt2regex.sh:379\nmsgid \"a ready regex (not implemented)\"\nmsgstr \"uma regex pronta (não implementado)\"\n\n#: txt2regex.sh:380\nmsgid \"anything\"\nmsgstr \"qualquer coisa\"\n\n#: txt2regex.sh:396\nmsgid \"how many times (repetition)\"\nmsgstr \"quantas vezes (repetição)\"\n\n#: txt2regex.sh:397\nmsgid \"one\"\nmsgstr \"uma\"\n\n#: txt2regex.sh:398\nmsgid \"zero or one (optional)\"\nmsgstr \"zero ou uma (opcional)\"\n\n#: txt2regex.sh:399\nmsgid \"zero or more\"\nmsgstr \"zero ou mais\"\n\n#: txt2regex.sh:400\nmsgid \"one or more\"\nmsgstr \"uma ou mais\"\n\n#: txt2regex.sh:401\nmsgid \"exactly N\"\nmsgstr \"exatamente N\"\n\n#: txt2regex.sh:402\nmsgid \"up to N\"\nmsgstr \"até N\"\n\n#: txt2regex.sh:403\nmsgid \"at least N\"\nmsgstr \"no mínimo N\"\n\n#: txt2regex.sh:408 txt2regex.sh:428\nmsgid \"uppercase letters\"\nmsgstr \"letras maiúsculas\"\n\n#: txt2regex.sh:409 txt2regex.sh:427\nmsgid \"lowercase letters\"\nmsgstr \"letras minúsculas\"\n\n#: txt2regex.sh:410 txt2regex.sh:429\nmsgid \"numbers\"\nmsgstr \"números\"\n\n#: txt2regex.sh:411\nmsgid \"underscore\"\nmsgstr \"sublinha\"\n\n#: txt2regex.sh:412\nmsgid \"space\"\nmsgstr \"espaço\"\n\n#: txt2regex.sh:413\nmsgid \"TAB\"\nmsgstr \"TAB\"\n\n#: txt2regex.sh:426\nmsgid \"letters\"\nmsgstr \"letras\"\n\n#: txt2regex.sh:430\nmsgid \"letters and numbers\"\nmsgstr \"letras e números\"\n\n#: txt2regex.sh:431\nmsgid \"hexadecimal numbers\"\nmsgstr \"números hexadecimais\"\n\n#: txt2regex.sh:432\nmsgid \"whitespaces (space and TAB)\"\nmsgstr \"brancos (espaço e TAB)\"\n\n#: txt2regex.sh:433\nmsgid \"graphic chars (not-whitespace)\"\nmsgstr \"caracteres gráficos (não brancos)\"\n\n#: txt2regex.sh:448\nmsgid \"quit\"\nmsgstr \"sair\"\n\n#: txt2regex.sh:449\nmsgid \"reset\"\nmsgstr \"zerar\"\n\n#: txt2regex.sh:450\nmsgid \"color\"\nmsgstr \"cor\"\n\n#: txt2regex.sh:451\nmsgid \"programs\"\nmsgstr \"programas\"\n\n#: txt2regex.sh:474\nmsgid \"or\"\nmsgstr \"ou\"\n\n#: txt2regex.sh:475\nmsgid \"open group\"\nmsgstr \"abrir grupo\"\n\n#: txt2regex.sh:476\nmsgid \"close group\"\nmsgstr \"fechar grupo\"\n\n#: txt2regex.sh:483\nmsgid \"not supported\"\nmsgstr \"não suportado\"\n\n#: txt2regex.sh:724\nmsgid \"NOTE: . [] [^] and * are the same on all programs.\"\nmsgstr \"NOTA: . [] [^] e * são iguais para todos.\"\n\n#: txt2regex.sh:735 txt2regex.sh:736\nmsgid \"NO\"\nmsgstr \"NÃO\"\n\n#: txt2regex.sh:748 txt2regex.sh:749\nmsgid \"YES\"\nmsgstr \"SIM\"\n\n#: txt2regex.sh:765\nmsgid \"program\"\nmsgstr \"programa\"\n\n#: txt2regex.sh:766\nmsgid \"metas\"\nmsgstr \"metas\"\n\n#: txt2regex.sh:767\nmsgid \"esc meta\"\nmsgstr \"meta de escape\"\n\n#: txt2regex.sh:768\nmsgid \"need esc\"\nmsgstr \"precisa escapar\"\n\n#: txt2regex.sh:769\nmsgid \"\\\\t in []\"\nmsgstr \"\\\\t em []\"\n\n#: txt2regex.sh:823\nmsgid \"Your terminal has %d lines, but txt2regex needs at least %d lines.\"\nmsgstr \"O seu terminal tem %d linhas, mas o txt2regex precisa de ao menos %d.\"\n\n#: txt2regex.sh:828\nmsgid \"Increase the number of lines or select less programs using --prog.\"\nmsgstr \"Aumente o número de linhas ou escolha menos programas com --prog.\"\n\n#: txt2regex.sh:829\nmsgid \"If this line number detection is incorrect, export the LINES variable.\"\nmsgstr \"Se esta detecção de linhas estiver incorreta, exporte a variável LINES.\"\n\n#: txt2regex.sh:1027\nmsgid \"which one?\"\nmsgstr \"qual?\"\n\n#: txt2regex.sh:1043\nmsgid \"which?\"\nmsgstr \"quais?\"\n\n#: txt2regex.sh:1326\nmsgid \"exit\"\nmsgstr \"sair\"\n\n#: txt2regex.sh:1327\nmsgid \"press the letters to (un)select the items\"\nmsgstr \"escolha as letras para (des)ativar os itens\"\n\n#: txt2regex.sh:1505\nmsgid \"repeated\"\nmsgstr \"repetido\"\n\n#: txt2regex.sh:1507\nmsgid \"times\"\nmsgstr \"vezes\"\n\n#: txt2regex.sh:1516\nmsgid \"Really quit?\"\nmsgstr \"Vai sair mesmo?\"\n\n#: txt2regex.sh:1540\nmsgid \"no regex\"\nmsgstr \"nenhuma regex\"\n"
  },
  {
    "path": "po/ro_RO.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: txt2regex 0.7\\n\"\n\"POT-Creation-Date: 2020-05-17 07:16 CEST\\n\"\n\"PO-Revision-Date: 2004-05-10 00:00+000\\n\"\n\"Last-Translator: Robert Gheorghe <robert...@yahoo.ca>\\n\"\n\"Language: ro_RO\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: txt2regex.sh:92\nmsgid \"ERROR\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:118 txt2regex.sh:120 txt2regex.sh:129\nmsgid \"PROGRAMS\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:114 txt2regex.sh:116 txt2regex.sh:118\n#: txt2regex.sh:120\nmsgid \"usage:\"\nmsgstr \"utilizare:\"\n\n#: txt2regex.sh:116 txt2regex.sh:134\nmsgid \"PROGRAM\"\nmsgstr \"\"\n\n#: txt2regex.sh:118 txt2regex.sh:136\nmsgid \"VALUE\"\nmsgstr \"\"\n\n#: txt2regex.sh:120 txt2regex.sh:138\nmsgid \"LABEL\"\nmsgstr \"\"\n\n#: txt2regex.sh:122\nmsgid \"Options:\"\nmsgstr \"Optiuni:\"\n\n#: txt2regex.sh:124\nmsgid \"Select all the available programs\"\nmsgstr \"Sa functioneze cu toate programele suportate\"\n\n#: txt2regex.sh:126\nmsgid \"Do not use colors\"\nmsgstr \"Arata meniul in alb/negru\"\n\n#: txt2regex.sh:128\nmsgid \"Adjust colors for white background terminals\"\nmsgstr \"Foloseste culori vizibile pe terminale cu fundal alb.\"\n\n#: txt2regex.sh:130\nmsgid \"Specify which programs to use, separated by commas\"\nmsgstr \"Alege ce programe sa folosesti (separate de virgule)\"\n\n#: txt2regex.sh:133\nmsgid \"Print a metacharacters table featuring all the programs\"\nmsgstr \"Tipareste tabela de simboluri(metacaractere) pentru toate programele suportate\"\n\n#: txt2regex.sh:135\nmsgid \"Print regex-related info about the specified program\"\nmsgstr \"Tipareste informatii regex pertinente programului specificat\"\n\n#: txt2regex.sh:137\nmsgid \"Print a regex from the given history data\"\nmsgstr \"\"\n\n#: txt2regex.sh:139\nmsgid \"Print a ready regex for the specified label\"\nmsgstr \"Tipareste un regex pre-calculat(generic)\"\n\n#: txt2regex.sh:142\nmsgid \"Print the program version and quit\"\nmsgstr \"Tipareste versiunea programului si iese\"\n\n#: txt2regex.sh:144\nmsgid \"Print the help message and quit\"\nmsgstr \"Tipareste mesajul de ajutor si iese\"\n\n#: txt2regex.sh:277\nmsgid \"unknown program\"\nmsgstr \"program necunoscut\"\n\n#: txt2regex.sh:305\nmsgid \"invalid argument\"\nmsgstr \"argument invalid\"\n\n#: txt2regex.sh:306\nmsgid \"valid names:\"\nmsgstr \"nume valide:\"\n\n#: txt2regex.sh:348\nmsgid \"invalid option\"\nmsgstr \"optiune invalida\"\n\n#: txt2regex.sh:360\nmsgid \"start to match\"\nmsgstr \"incepe cautarea\"\n\n#: txt2regex.sh:361\nmsgid \"on the line beginning\"\nmsgstr \"la inceputul liniei\"\n\n#: txt2regex.sh:362\nmsgid \"in any part of the line\"\nmsgstr \"oriunde pe linie\"\n\n#: txt2regex.sh:371\nmsgid \"followed by\"\nmsgstr \"urmat(a) de\"\n\n#: txt2regex.sh:372\nmsgid \"any character\"\nmsgstr \"orice caracter\"\n\n#: txt2regex.sh:373\nmsgid \"a specific character\"\nmsgstr \"un caracter specific\"\n\n#: txt2regex.sh:374\nmsgid \"a literal string\"\nmsgstr \"un sir de caractere\"\n\n#: txt2regex.sh:375\nmsgid \"an allowed characters list\"\nmsgstr \"o lista de caractere permise\"\n\n#: txt2regex.sh:376\nmsgid \"a forbidden characters list\"\nmsgstr \"a lista de caractere interzise\"\n\n#: txt2regex.sh:377\nmsgid \"a special combination\"\nmsgstr \"o combinatie speciala\"\n\n#: txt2regex.sh:378\nmsgid \"a POSIX combination (locale aware)\"\nmsgstr \"o combinatie POSIX (locale aware)\"\n\n#: txt2regex.sh:379\nmsgid \"a ready regex (not implemented)\"\nmsgstr \"o expresie regulata existenta (optine ne-implementata)\"\n\n#: txt2regex.sh:380\nmsgid \"anything\"\nmsgstr \"orice\"\n\n#: txt2regex.sh:396\nmsgid \"how many times (repetition)\"\nmsgstr \"de cate ori (repetitii)\"\n\n#: txt2regex.sh:397\nmsgid \"one\"\nmsgstr \"o data\"\n\n#: txt2regex.sh:398\nmsgid \"zero or one (optional)\"\nmsgstr \"niciodata sau o data (camp optional)\"\n\n#: txt2regex.sh:399\nmsgid \"zero or more\"\nmsgstr \"zero sau mai multe\"\n\n#: txt2regex.sh:400\nmsgid \"one or more\"\nmsgstr \"unu sau mai multe\"\n\n#: txt2regex.sh:401\nmsgid \"exactly N\"\nmsgstr \"de exact N ori\"\n\n#: txt2regex.sh:402\nmsgid \"up to N\"\nmsgstr \"de pana la N ori\"\n\n#: txt2regex.sh:403\nmsgid \"at least N\"\nmsgstr \"cel putin N ori\"\n\n#: txt2regex.sh:408 txt2regex.sh:428\nmsgid \"uppercase letters\"\nmsgstr \"litere mari\"\n\n#: txt2regex.sh:409 txt2regex.sh:427\nmsgid \"lowercase letters\"\nmsgstr \"litere mici\"\n\n#: txt2regex.sh:410 txt2regex.sh:429\nmsgid \"numbers\"\nmsgstr \"numere\"\n\n#: txt2regex.sh:411\nmsgid \"underscore\"\nmsgstr \"underscore\"\n\n#: txt2regex.sh:412\nmsgid \"space\"\nmsgstr \"spatiu\"\n\n#: txt2regex.sh:413\nmsgid \"TAB\"\nmsgstr \"caracterul TAB\"\n\n#: txt2regex.sh:426\nmsgid \"letters\"\nmsgstr \"litere\"\n\n#: txt2regex.sh:430\nmsgid \"letters and numbers\"\nmsgstr \"litere si numere\"\n\n#: txt2regex.sh:431\nmsgid \"hexadecimal numbers\"\nmsgstr \"numere hexadecimale\"\n\n#: txt2regex.sh:432\nmsgid \"whitespaces (space and TAB)\"\nmsgstr \"spatii albe (spatii si TAB-uri)\"\n\n#: txt2regex.sh:433\nmsgid \"graphic chars (not-whitespace)\"\nmsgstr \"caractere grafice (care nu sunt spatii albe)\"\n\n#: txt2regex.sh:448\nmsgid \"quit\"\nmsgstr \"renunta\"\n\n#: txt2regex.sh:449\nmsgid \"reset\"\nmsgstr \"reporneste\"\n\n#: txt2regex.sh:450\nmsgid \"color\"\nmsgstr \"culoare\"\n\n#: txt2regex.sh:451\nmsgid \"programs\"\nmsgstr \"programe\"\n\n#: txt2regex.sh:474\nmsgid \"or\"\nmsgstr \"sau\"\n\n#: txt2regex.sh:475\nmsgid \"open group\"\nmsgstr \"deschide grupare\"\n\n#: txt2regex.sh:476\nmsgid \"close group\"\nmsgstr \"inchide grupare\"\n\n#: txt2regex.sh:483\nmsgid \"not supported\"\nmsgstr \"nu e suportata\"\n\n#: txt2regex.sh:724\nmsgid \"NOTE: . [] [^] and * are the same on all programs.\"\nmsgstr \"NOTA: . [] [^] si * sunt aceleasi in toate programele.\"\n\n#: txt2regex.sh:735 txt2regex.sh:736\nmsgid \"NO\"\nmsgstr \"NU\"\n\n#: txt2regex.sh:748 txt2regex.sh:749\nmsgid \"YES\"\nmsgstr \"DA\"\n\n#: txt2regex.sh:765\nmsgid \"program\"\nmsgstr \"program\"\n\n#: txt2regex.sh:766\nmsgid \"metas\"\nmsgstr \"meta caractere\"\n\n#: txt2regex.sh:767\nmsgid \"esc meta\"\nmsgstr \"meta-caractere escapate\"\n\n#: txt2regex.sh:768\nmsgid \"need esc\"\nmsgstr \"necesita esc\"\n\n#: txt2regex.sh:769\nmsgid \"\\\\t in []\"\nmsgstr \"\\\\t in []\"\n\n#: txt2regex.sh:823\nmsgid \"Your terminal has %d lines, but txt2regex needs at least %d lines.\"\nmsgstr \"\"\n\n#: txt2regex.sh:828\nmsgid \"Increase the number of lines or select less programs using --prog.\"\nmsgstr \"\"\n\n#: txt2regex.sh:829\nmsgid \"If this line number detection is incorrect, export the LINES variable.\"\nmsgstr \"\"\n\n#: txt2regex.sh:1027\nmsgid \"which one?\"\nmsgstr \"care din ele?\"\n\n#: txt2regex.sh:1043\nmsgid \"which?\"\nmsgstr \"care?\"\n\n#: txt2regex.sh:1326\nmsgid \"exit\"\nmsgstr \"iesire\"\n\n#: txt2regex.sh:1327\nmsgid \"press the letters to (un)select the items\"\nmsgstr \"apasa literele ca sa (de)selectezi elementele\"\n\n#: txt2regex.sh:1505\nmsgid \"repeated\"\nmsgstr \"repetata\"\n\n#: txt2regex.sh:1507\nmsgid \"times\"\nmsgstr \"ori\"\n\n#: txt2regex.sh:1516\nmsgid \"Really quit?\"\nmsgstr \"Esti sigur(a) ca vrei sa renunti?\"\n\n#: txt2regex.sh:1540\nmsgid \"no regex\"\nmsgstr \"\"\n\n#~ msgid \"\"\n#~ \"usage: txt2regex [--nocolor|--whitebg|--all]\\n\"\n#~ \"       txt2regex --showmeta|--showinfo <program>\\n\"\n#~ \"       txt2regex [--all|--prog <p1,p2>] --make <target>\\n\"\n#~ \"       txt2regex --history <value>\\n\"\n#~ \"\\n\"\n#~ \"OPTIONS (they are default OFF):\\n\"\n#~ \"\\n\"\n#~ \"  --all                 works with all registered programs\\n\"\n#~ \"  --nocolor             self-explanatory\\n\"\n#~ \"  --whitebg             colors adjusted to white background terminals\\n\"\n#~ \"  --showmeta            prints a complete metachar table for all programs\\n\"\n#~ \"  --showinfo <program>  prints regex info about the program\\n\"\n#~ \"\\n\"\n#~ \"  --history <value>     prints to STDOUT a RegEx from a history data\\n\"\n#~ \"  --make <target>       prints a ready RegEx for a common pattern\\n\"\n#~ \"  --prog <p1,p2,...>    choose which programs to use (separated by commas)\\n\"\n#~ \"\\n\"\n#~ \"  --version             prints the program version and quit\\n\"\n#~ \"  --help                prints the help message and quit\\n\"\n#~ \"\\n\"\n#~ \"for more details about the options, read the README file.\"\n#~ msgstr \"\"\n#~ \"utilizare: txt2regex [--nocolor|--whitebg|--all]\\n\"\n#~ \"       txt2regex --showmeta|--showinfo <program>\\n\"\n#~ \"       txt2regex [--all|--prog <p1,p2>] --make <target>\\n\"\n#~ \"       txt2regex --history <value>\\n\"\n#~ \"\\n\"\n#~ \"OPTIUNI (implicit sunt dezactivate):\\n\"\n#~ \"\\n\"\n#~ \"  --all                 sa functioneze cu toate programele suportate\\n\"\n#~ \"  --nocolor             arata meniul in alb/negru\\n\"\n#~ \"  --whitebg             foloseste culori vizibile pe terminale cu fundal alb.\\n\"\n#~ \"  --showmeta            tipareste tabela de simboluri(metacaractere) pentru toate programele suportate\\n\"\n#~ \"  --showinfo <program>  tipareste informatii regex pertinente programului specificat\\n\"\n#~ \"\\n\"\n#~ \"  --history <value>     tipareste la STDOUT RegEx 'from a history data'\\n\"\n#~ \"  --make <target>       tipareste un RegEx pre-calculat(generic)\\n\"\n#~ \"  --prog <p1,p2,...>    alege ce programe sa folosesti (separate de virgule)\\n\"\n#~ \"\\n\"\n#~ \"  --version             tipareste versiunea programului si iese\\n\"\n#~ \"  --help                tipareste mesajul de ajutor si iese\\n\"\n#~ \"\\n\"\n#~ \"pentru detalii mai de amanunt despre optiunile programului, citeste fisierul README.\"\n"
  },
  {
    "path": "po/tr.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: txt2regex 0.9\\n\"\n\"POT-Creation-Date: 2020-05-17 07:16 CEST\\n\"\n\"PO-Revision-Date: 2016-06-06 23:42+0300\\n\"\n\"Last-Translator: erayalakese\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION\\n\"\n\"X-Poedit-SourceCharset: UTF-8\\n\"\n\"X-Loco-Source-Locale: tr_TR\\n\"\n\"X-Loco-Parser: loco_parse_po\\n\"\n\"X-Generator: Loco - https://localise.biz/\\n\"\n\n#: txt2regex.sh:92\nmsgid \"ERROR\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:118 txt2regex.sh:120 txt2regex.sh:129\nmsgid \"PROGRAMS\"\nmsgstr \"PROGRAMLAR\"\n\n#: txt2regex.sh:112 txt2regex.sh:114 txt2regex.sh:116 txt2regex.sh:118\n#: txt2regex.sh:120\nmsgid \"usage:\"\nmsgstr \"kullanım:\"\n\n#: txt2regex.sh:116 txt2regex.sh:134\nmsgid \"PROGRAM\"\nmsgstr \"PROGRAM\"\n\n#: txt2regex.sh:118 txt2regex.sh:136\nmsgid \"VALUE\"\nmsgstr \"DEĞER\"\n\n#: txt2regex.sh:120 txt2regex.sh:138\nmsgid \"LABEL\"\nmsgstr \"ETİKET\"\n\n#: txt2regex.sh:122\nmsgid \"Options:\"\nmsgstr \"Seçenekler:\"\n\n#: txt2regex.sh:124\nmsgid \"Select all the available programs\"\nmsgstr \"Tüm kayıtlı programlarla çalışır\"\n\n#: txt2regex.sh:126\nmsgid \"Do not use colors\"\nmsgstr \"Renk kullanma\"\n\n#: txt2regex.sh:128\nmsgid \"Adjust colors for white background terminals\"\nmsgstr \"Renkler siyah-beyaz terminal ekranlarına göre ayarlanır\"\n\n#: txt2regex.sh:130\nmsgid \"Specify which programs to use, separated by commas\"\nmsgstr \"Hangi programların kullanılanacağını seçin (virgülle ayrılmış)\"\n\n#: txt2regex.sh:133\nmsgid \"Print a metacharacters table featuring all the programs\"\nmsgstr \"\"\n\n#: txt2regex.sh:135\nmsgid \"Print regex-related info about the specified program\"\nmsgstr \"Belirtilen program için regex bilgisi verir\"\n\n#: txt2regex.sh:137\nmsgid \"Print a regex from the given history data\"\nmsgstr \"\"\n\n#: txt2regex.sh:139\nmsgid \"Print a ready regex for the specified label\"\nmsgstr \"\"\n\n#: txt2regex.sh:142\nmsgid \"Print the program version and quit\"\nmsgstr \"Program versiyonunu yazdırır ve çıkar\"\n\n#: txt2regex.sh:144\nmsgid \"Print the help message and quit\"\nmsgstr \"Yardım mesajı yazdırır ve çıkar\"\n\n#: txt2regex.sh:277\nmsgid \"unknown program\"\nmsgstr \"\"\n\n#: txt2regex.sh:305\nmsgid \"invalid argument\"\nmsgstr \"geçersiz parametre\"\n\n#: txt2regex.sh:306\n#, fuzzy\nmsgid \"valid names:\"\nmsgstr \"geçerli isimler:\"\n\n#: txt2regex.sh:348\nmsgid \"invalid option\"\nmsgstr \"geçersiz seçenek\"\n\n#: txt2regex.sh:360\nmsgid \"start to match\"\nmsgstr \"eşleştirmeye başla\"\n\n#: txt2regex.sh:361\nmsgid \"on the line beginning\"\nmsgstr \"sayfanın başında\"\n\n#: txt2regex.sh:362\nmsgid \"in any part of the line\"\nmsgstr \"sayfanın herhangi bir yerinde\"\n\n#: txt2regex.sh:371\nmsgid \"followed by\"\nmsgstr \"\"\n\n#: txt2regex.sh:372\nmsgid \"any character\"\nmsgstr \"herhangi bir karakter\"\n\n#: txt2regex.sh:373\nmsgid \"a specific character\"\nmsgstr \"belli bir karakter\"\n\n#: txt2regex.sh:374\nmsgid \"a literal string\"\nmsgstr \"belli bir ifade (string)\"\n\n#: txt2regex.sh:375\nmsgid \"an allowed characters list\"\nmsgstr \"izin verilen karakterler listesi\"\n\n#: txt2regex.sh:376\nmsgid \"a forbidden characters list\"\nmsgstr \"yasaklı karakterler listesi\"\n\n#: txt2regex.sh:377\nmsgid \"a special combination\"\nmsgstr \"özel bir kombinasyon\"\n\n#: txt2regex.sh:378\nmsgid \"a POSIX combination (locale aware)\"\nmsgstr \"POSIX kombinasyonu\"\n\n#: txt2regex.sh:379\nmsgid \"a ready regex (not implemented)\"\nmsgstr \"hazır bir REGEX (henüz implement edilmedi)\"\n\n#: txt2regex.sh:380\nmsgid \"anything\"\nmsgstr \"herşey\"\n\n#: txt2regex.sh:396\nmsgid \"how many times (repetition)\"\nmsgstr \"kaç kere (tekrar)\"\n\n#: txt2regex.sh:397\nmsgid \"one\"\nmsgstr \"bir\"\n\n#: txt2regex.sh:398\nmsgid \"zero or one (optional)\"\nmsgstr \"sıfır ya da bir (isteğe bağlı)\"\n\n#: txt2regex.sh:399\nmsgid \"zero or more\"\nmsgstr \"sıfır ya da daha fazla\"\n\n#: txt2regex.sh:400\nmsgid \"one or more\"\nmsgstr \"bir ya da daha fazla\"\n\n#: txt2regex.sh:401\nmsgid \"exactly N\"\nmsgstr \"N tane\"\n\n#: txt2regex.sh:402\nmsgid \"up to N\"\nmsgstr \"N'e kadar\"\n\n#: txt2regex.sh:403\nmsgid \"at least N\"\nmsgstr \"en az N tane\"\n\n#: txt2regex.sh:408 txt2regex.sh:428\nmsgid \"uppercase letters\"\nmsgstr \"büyük harfler\"\n\n#: txt2regex.sh:409 txt2regex.sh:427\nmsgid \"lowercase letters\"\nmsgstr \"küçük harfler\"\n\n#: txt2regex.sh:410 txt2regex.sh:429\nmsgid \"numbers\"\nmsgstr \"sayılar\"\n\n#: txt2regex.sh:411\nmsgid \"underscore\"\nmsgstr \"altçizgi\"\n\n#: txt2regex.sh:412\nmsgid \"space\"\nmsgstr \"boşluk\"\n\n#: txt2regex.sh:413\nmsgid \"TAB\"\nmsgstr \"\"\n\n#: txt2regex.sh:426\nmsgid \"letters\"\nmsgstr \"harfler\"\n\n#: txt2regex.sh:430\nmsgid \"letters and numbers\"\nmsgstr \"harfler ve sayılar\"\n\n#: txt2regex.sh:431\nmsgid \"hexadecimal numbers\"\nmsgstr \"heksadesimal sayılar\"\n\n#: txt2regex.sh:432\nmsgid \"whitespaces (space and TAB)\"\nmsgstr \"boşluklar (space ve TAB)\"\n\n#: txt2regex.sh:433\nmsgid \"graphic chars (not-whitespace)\"\nmsgstr \"\"\n\n#: txt2regex.sh:448\nmsgid \"quit\"\nmsgstr \"çık\"\n\n#: txt2regex.sh:449\nmsgid \"reset\"\nmsgstr \"sıfırla\"\n\n#: txt2regex.sh:450\nmsgid \"color\"\nmsgstr \"renk\"\n\n#: txt2regex.sh:451\nmsgid \"programs\"\nmsgstr \"\"\n\n#: txt2regex.sh:474\nmsgid \"or\"\nmsgstr \"veya\"\n\n#: txt2regex.sh:475\nmsgid \"open group\"\nmsgstr \"grup aç\"\n\n#: txt2regex.sh:476\nmsgid \"close group\"\nmsgstr \"grubu kapat\"\n\n#: txt2regex.sh:483\nmsgid \"not supported\"\nmsgstr \"desteklenmiyor\"\n\n#: txt2regex.sh:724\nmsgid \"NOTE: . [] [^] and * are the same on all programs.\"\nmsgstr \"\"\n\n#: txt2regex.sh:735 txt2regex.sh:736\nmsgid \"NO\"\nmsgstr \"HAYIR\"\n\n#: txt2regex.sh:748 txt2regex.sh:749\nmsgid \"YES\"\nmsgstr \"EVET\"\n\n#: txt2regex.sh:765\nmsgid \"program\"\nmsgstr \"\"\n\n#: txt2regex.sh:766\nmsgid \"metas\"\nmsgstr \"\"\n\n#: txt2regex.sh:767\nmsgid \"esc meta\"\nmsgstr \"\"\n\n#: txt2regex.sh:768\nmsgid \"need esc\"\nmsgstr \"\"\n\n#: txt2regex.sh:769\nmsgid \"\\\\t in []\"\nmsgstr \"\"\n\n#: txt2regex.sh:823\nmsgid \"Your terminal has %d lines, but txt2regex needs at least %d lines.\"\nmsgstr \"\"\n\n#: txt2regex.sh:828\nmsgid \"Increase the number of lines or select less programs using --prog.\"\nmsgstr \"\"\n\n#: txt2regex.sh:829\nmsgid \"If this line number detection is incorrect, export the LINES variable.\"\nmsgstr \"\"\n\n#: txt2regex.sh:1027\nmsgid \"which one?\"\nmsgstr \"hangisi?\"\n\n#: txt2regex.sh:1043\nmsgid \"which?\"\nmsgstr \"hangisi?\"\n\n#: txt2regex.sh:1326\nmsgid \"exit\"\nmsgstr \"çık\"\n\n#: txt2regex.sh:1327\nmsgid \"press the letters to (un)select the items\"\nmsgstr \"seçimi değiştirmek için harflere basın\"\n\n#: txt2regex.sh:1505\nmsgid \"repeated\"\nmsgstr \"tekrar edildi\"\n\n#: txt2regex.sh:1507\nmsgid \"times\"\nmsgstr \"kere\"\n\n#: txt2regex.sh:1516\nmsgid \"Really quit?\"\nmsgstr \"Gerçekten çıkmak istiyor musunuz?\"\n\n#: txt2regex.sh:1540\nmsgid \"no regex\"\nmsgstr \"regex yok\"\n"
  },
  {
    "path": "po/txt2regex.pot",
    "content": "#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: txt2regex 0.9\\n\"\n\"POT-Creation-Date: 2020-05-21 00:49 CEST\\n\"\n\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: txt2regex.sh:92\nmsgid \"ERROR\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:118 txt2regex.sh:120 txt2regex.sh:129\nmsgid \"PROGRAMS\"\nmsgstr \"\"\n\n#: txt2regex.sh:112 txt2regex.sh:114 txt2regex.sh:116 txt2regex.sh:118\n#: txt2regex.sh:120\nmsgid \"usage:\"\nmsgstr \"\"\n\n#: txt2regex.sh:116 txt2regex.sh:134\nmsgid \"PROGRAM\"\nmsgstr \"\"\n\n#: txt2regex.sh:118 txt2regex.sh:136\nmsgid \"VALUE\"\nmsgstr \"\"\n\n#: txt2regex.sh:120 txt2regex.sh:138\nmsgid \"LABEL\"\nmsgstr \"\"\n\n#: txt2regex.sh:122\nmsgid \"Options:\"\nmsgstr \"\"\n\n#: txt2regex.sh:124\nmsgid \"Select all the available programs\"\nmsgstr \"\"\n\n#: txt2regex.sh:126\nmsgid \"Do not use colors\"\nmsgstr \"\"\n\n#: txt2regex.sh:128\nmsgid \"Adjust colors for white background terminals\"\nmsgstr \"\"\n\n#: txt2regex.sh:130\nmsgid \"Specify which programs to use, separated by commas\"\nmsgstr \"\"\n\n#: txt2regex.sh:133\nmsgid \"Print a metacharacters table featuring all the programs\"\nmsgstr \"\"\n\n#: txt2regex.sh:135\nmsgid \"Print regex-related info about the specified program\"\nmsgstr \"\"\n\n#: txt2regex.sh:137\nmsgid \"Print a regex from the given history data\"\nmsgstr \"\"\n\n#: txt2regex.sh:139\nmsgid \"Print a ready regex for the specified label\"\nmsgstr \"\"\n\n#: txt2regex.sh:142\nmsgid \"Print the program version and quit\"\nmsgstr \"\"\n\n#: txt2regex.sh:144\nmsgid \"Print the help message and quit\"\nmsgstr \"\"\n\n#: txt2regex.sh:277\nmsgid \"unknown program\"\nmsgstr \"\"\n\n#: txt2regex.sh:305\nmsgid \"invalid argument\"\nmsgstr \"\"\n\n#: txt2regex.sh:306\nmsgid \"valid names:\"\nmsgstr \"\"\n\n#: txt2regex.sh:348\nmsgid \"invalid option\"\nmsgstr \"\"\n\n#: txt2regex.sh:360\nmsgid \"start to match\"\nmsgstr \"\"\n\n#: txt2regex.sh:361\nmsgid \"on the line beginning\"\nmsgstr \"\"\n\n#: txt2regex.sh:362\nmsgid \"in any part of the line\"\nmsgstr \"\"\n\n#: txt2regex.sh:371\nmsgid \"followed by\"\nmsgstr \"\"\n\n#: txt2regex.sh:372\nmsgid \"any character\"\nmsgstr \"\"\n\n#: txt2regex.sh:373\nmsgid \"a specific character\"\nmsgstr \"\"\n\n#: txt2regex.sh:374\nmsgid \"a literal string\"\nmsgstr \"\"\n\n#: txt2regex.sh:375\nmsgid \"an allowed characters list\"\nmsgstr \"\"\n\n#: txt2regex.sh:376\nmsgid \"a forbidden characters list\"\nmsgstr \"\"\n\n#: txt2regex.sh:377\nmsgid \"a special combination\"\nmsgstr \"\"\n\n#: txt2regex.sh:378\nmsgid \"a POSIX combination (locale aware)\"\nmsgstr \"\"\n\n#: txt2regex.sh:379\nmsgid \"a ready regex (not implemented)\"\nmsgstr \"\"\n\n#: txt2regex.sh:380\nmsgid \"anything\"\nmsgstr \"\"\n\n#: txt2regex.sh:396\nmsgid \"how many times (repetition)\"\nmsgstr \"\"\n\n#: txt2regex.sh:397\nmsgid \"one\"\nmsgstr \"\"\n\n#: txt2regex.sh:398\nmsgid \"zero or one (optional)\"\nmsgstr \"\"\n\n#: txt2regex.sh:399\nmsgid \"zero or more\"\nmsgstr \"\"\n\n#: txt2regex.sh:400\nmsgid \"one or more\"\nmsgstr \"\"\n\n#: txt2regex.sh:401\nmsgid \"exactly N\"\nmsgstr \"\"\n\n#: txt2regex.sh:402\nmsgid \"up to N\"\nmsgstr \"\"\n\n#: txt2regex.sh:403\nmsgid \"at least N\"\nmsgstr \"\"\n\n#: txt2regex.sh:408 txt2regex.sh:428\nmsgid \"uppercase letters\"\nmsgstr \"\"\n\n#: txt2regex.sh:409 txt2regex.sh:427\nmsgid \"lowercase letters\"\nmsgstr \"\"\n\n#: txt2regex.sh:410 txt2regex.sh:429\nmsgid \"numbers\"\nmsgstr \"\"\n\n#: txt2regex.sh:411\nmsgid \"underscore\"\nmsgstr \"\"\n\n#: txt2regex.sh:412\nmsgid \"space\"\nmsgstr \"\"\n\n#: txt2regex.sh:413\nmsgid \"TAB\"\nmsgstr \"\"\n\n#: txt2regex.sh:426\nmsgid \"letters\"\nmsgstr \"\"\n\n#: txt2regex.sh:430\nmsgid \"letters and numbers\"\nmsgstr \"\"\n\n#: txt2regex.sh:431\nmsgid \"hexadecimal numbers\"\nmsgstr \"\"\n\n#: txt2regex.sh:432\nmsgid \"whitespaces (space and TAB)\"\nmsgstr \"\"\n\n#: txt2regex.sh:433\nmsgid \"graphic chars (not-whitespace)\"\nmsgstr \"\"\n\n#: txt2regex.sh:448\nmsgid \"quit\"\nmsgstr \"\"\n\n#: txt2regex.sh:449\nmsgid \"reset\"\nmsgstr \"\"\n\n#: txt2regex.sh:450\nmsgid \"color\"\nmsgstr \"\"\n\n#: txt2regex.sh:451\nmsgid \"programs\"\nmsgstr \"\"\n\n#: txt2regex.sh:474\nmsgid \"or\"\nmsgstr \"\"\n\n#: txt2regex.sh:475\nmsgid \"open group\"\nmsgstr \"\"\n\n#: txt2regex.sh:476\nmsgid \"close group\"\nmsgstr \"\"\n\n#: txt2regex.sh:483\nmsgid \"not supported\"\nmsgstr \"\"\n\n#: txt2regex.sh:724\nmsgid \"NOTE: . [] [^] and * are the same on all programs.\"\nmsgstr \"\"\n\n#: txt2regex.sh:735 txt2regex.sh:736\nmsgid \"NO\"\nmsgstr \"\"\n\n#: txt2regex.sh:748 txt2regex.sh:749\nmsgid \"YES\"\nmsgstr \"\"\n\n#: txt2regex.sh:765\nmsgid \"program\"\nmsgstr \"\"\n\n#: txt2regex.sh:766\nmsgid \"metas\"\nmsgstr \"\"\n\n#: txt2regex.sh:767\nmsgid \"esc meta\"\nmsgstr \"\"\n\n#: txt2regex.sh:768\nmsgid \"need esc\"\nmsgstr \"\"\n\n#: txt2regex.sh:769\nmsgid \"\\\\t in []\"\nmsgstr \"\"\n\n#: txt2regex.sh:823\nmsgid \"Your terminal has %d lines, but txt2regex needs at least %d lines.\"\nmsgstr \"\"\n\n#: txt2regex.sh:828\nmsgid \"Increase the number of lines or select less programs using --prog.\"\nmsgstr \"\"\n\n#: txt2regex.sh:829\nmsgid \"If this line number detection is incorrect, export the LINES variable.\"\nmsgstr \"\"\n\n#: txt2regex.sh:1027\nmsgid \"which one?\"\nmsgstr \"\"\n\n#: txt2regex.sh:1043\nmsgid \"which?\"\nmsgstr \"\"\n\n#: txt2regex.sh:1326\nmsgid \"exit\"\nmsgstr \"\"\n\n#: txt2regex.sh:1327\nmsgid \"press the letters to (un)select the items\"\nmsgstr \"\"\n\n#: txt2regex.sh:1505\nmsgid \"repeated\"\nmsgstr \"\"\n\n#: txt2regex.sh:1507\nmsgid \"times\"\nmsgstr \"\"\n\n#: txt2regex.sh:1516\nmsgid \"Really quit?\"\nmsgstr \"\"\n\n#: txt2regex.sh:1540\nmsgid \"no regex\"\nmsgstr \"\"\n"
  },
  {
    "path": "tests/Dockerfile",
    "content": "# A handy Docker container so I can test the regex support in most of\n# the programs that txt2regex supports.\n#\n# This is used by the tests/regex-tester.sh script.\n# Use `make test-regex` to build the image and run the tests on it.\n\nFROM ubuntu:18.04\n\n# To avoid \"Configuring tzdata\" prompt\nARG DEBIAN_FRONTEND=noninteractive\n\n# flex: gcc libc6-dev\nRUN apt-get update && \\\n    apt-get install -y --no-install-suggests --no-install-recommends \\\n    chicken-bin \\\n    ed \\\n    emacs-nox \\\n    expect \\\n    flex \\\n    gawk \\\n    gcc \\\n    libc6-dev \\\n    mysql-server \\\n    nodejs \\\n    nvi \\\n    original-awk \\\n    php7.2-cli \\\n    postgresql \\\n    procmail \\\n    python3-minimal \\\n    tcl \\\n    vim \\\n    && apt-get clean && rm -rf /var/lib/apt/lists/*\n"
  },
  {
    "path": "tests/cmdline.md",
    "content": "# Command line tests for txt2regex\n\nThis is file is both documentation and a test file, showing the available command line options for txt2regex and the expected result when using them.\n\nThe [clitest](https://github.com/aureliojargas/clitest) tool can identify and run all the commands listed here and check if their actual output matches the expected one. Just run `clitest tests/cmdline.md`.\n\n## Setup\n\nMake sure all the commands use the same Bash version and the same txt2regex file.\n\n```console\n$ txt2regex() { bash ./txt2regex.sh \"$@\"; }\n$\n```\n\n## Options -h, --help\n\n```console\n$ txt2regex --help | tee help.txt\nusage: txt2regex [--nocolor|--whitebg] [--all|--prog PROGRAMS]\nusage: txt2regex --showmeta\nusage: txt2regex --showinfo PROGRAM [--nocolor]\nusage: txt2regex --history VALUE [--all|--prog PROGRAMS]\nusage: txt2regex --make LABEL [--all|--prog PROGRAMS]\n\nOptions:\n  --all                 Select all the available programs\n  --nocolor             Do not use colors\n  --whitebg             Adjust colors for white background terminals\n  --prog PROGRAMS       Specify which programs to use, separated by commas\n\n  --showmeta            Print a metacharacters table featuring all the programs\n  --showinfo PROGRAM    Print regex-related info about the specified program\n  --history VALUE       Print a regex from the given history data\n  --make LABEL          Print a ready regex for the specified label\n\n  -V, --version         Print the program version and quit\n  -h, --help            Print the help message and quit\n\n$ txt2regex -h > h.txt\n$ diff help.txt h.txt\n$ rm help.txt h.txt\n$\n```\n\n## Options -V, --version\n\n```console\n$ txt2regex --version\ntxt2regex 0.10b\n$ txt2regex -V\ntxt2regex 0.10b\n$\n```\n\n## Option --showmeta\n\nA handy table showing all the metacharacters for all the programs txt2regex knows about. Nice for comparisons or for a quick memory refresh.\n\n```console\n$ txt2regex --showmeta\n\nawk             +      ?             |      ()    awk version 20121220\nchicken         +      ?     {}      |      ()    CHICKEN 4.12.0\ned             \\+     \\?   \\{\\}     \\|    \\(\\)    GNU Ed 1.10\negrep           +      ?     {}      |      ()    grep (GNU grep) 3.1\nemacs           +      ? \\\\{\\\\}    \\\\|  \\\\(\\\\)    GNU Emacs 25.2.2\nexpect          +      ?     {}      |      ()    expect version 5.45.4\nfind            +      ?     {}      |      ()    find (GNU findutils) 4.7.0-git\ngawk            +      ?     {}      |      ()    GNU Awk 4.1.4\ngrep           \\+     \\?   \\{\\}     \\|    \\(\\)    grep (GNU grep) 3.1\njavascript      +      ?     {}      |      ()    node v8.10.0\nlex             +      ?     {}      |      ()    flex 2.6.4\nmawk            +      ?             |      ()    mawk 1.3.3 Nov 1996\nmysql           +      ?     {}      |      ()    mysql  Ver 14.14 Distrib 5.7.29\nperl            +      ?     {}      |      ()    perl v5.26.1\nphp             +      ?     {}      |      ()    PHP 7.2.24-0ubuntu0.18.04.4\npostgres        +      ?     {}      |      ()    psql (PostgreSQL) 10.12\nprocmail        +      ?             |      ()    procmail v3.23pre 2001/09/13\npython          +      ?     {}      |      ()    Python 3.6.9\nsed            \\+     \\?   \\{\\}     \\|    \\(\\)    sed (GNU sed) 4.4\ntcl             +      ?     {}      |      ()    tcl 8.6\nvi                         \\{\\}           \\(\\)    nvi 1.81.6-13\nvim            \\+     \\=    \\{}     \\|    \\(\\)    VIM - Vi IMproved 8.0 (2016 Sep 12)\n\nNOTE: . [] [^] and * are the same on all programs.\n\n$\n```\n\n## Option --showinfo\n\nShows additional regex-related information about a specific program.\n\n```console\n$ txt2regex --showinfo sed --nocolor\n\n   program : sed: sed (GNU sed) 4.4\n     metas : . [] [^] * \\+ \\? \\{\\} \\| \\(\\)\n  esc meta : \\\n  need esc : \\.*[\n  \\t in [] : YES\n [:POSIX:] : YES\n\n$\n```\n\nError handling:\n\n```console\n$ txt2regex --showinfo | sed 1q | cut -d : -f 1\nusage\n$ txt2regex --showinfo foo\nERROR: unknown program: foo\n$ txt2regex --showinfo sed,python\nERROR: unknown program: sed,python\n$\n```\n\n## Option --history\n\nEvery time you quit txt2regex, it shows a history string that you can inform to `--history` to replay that same regex again.\n\n```console\n$ txt2regex --history '124259¤a¤b¤5'\n Regex python: ^a+b{5}.*\n Regex egrep : ^a+b{5}.*\n Regex grep  : ^a\\+b\\{5\\}.*\n Regex sed   : ^a\\+b\\{5\\}.*\n Regex vim   : ^a\\+b\\{5}.*\n Regex emacs : ^a+b\\\\{5\\\\}.*\n\n$\n```\n\nNote that you can also inform `--prog` to specify the list of programs (separated by a comma) to appear in the output.\n\n```console\n$ txt2regex --history '124259¤a¤b¤5' --prog sed,python,sed\n Regex sed   : ^a\\+b\\{5\\}.*\n Regex python: ^a+b{5}.*\n Regex sed   : ^a\\+b\\{5\\}.*\n\n$\n```\n\nAnother alternative is using `--all` to show your regex in the syntax of every program txt2regex knows about:\n\n```console\n$ txt2regex --history '124259¤a¤b¤5' --all\n Regex awk       : ^a+b!!.*\n Regex chicken   : ^a+b{5}.*\n Regex ed        : ^a\\+b\\{5\\}.*\n Regex egrep     : ^a+b{5}.*\n Regex emacs     : ^a+b\\\\{5\\\\}.*\n Regex expect    : ^a+b{5}.*\n Regex find      : ^a+b{5}.*\n Regex gawk      : ^a+b{5}.*\n Regex grep      : ^a\\+b\\{5\\}.*\n Regex javascript: ^a+b{5}.*\n Regex lex       : ^a+b{5}.*\n Regex mawk      : ^a+b!!.*\n Regex mysql     : ^a+b{5}.*\n Regex perl      : ^a+b{5}.*\n Regex php       : ^a+b{5}.*\n Regex postgres  : ^a+b{5}.*\n Regex procmail  : ^a+b!!.*\n Regex python    : ^a+b{5}.*\n Regex sed       : ^a\\+b\\{5\\}.*\n Regex tcl       : ^a+b{5}.*\n Regex vi        : ^a\\{1,\\}b\\{5\\}.*\n Regex vim       : ^a\\+b\\{5}.*\n\n$\n```\n\nStress test using all the available menu options:\n\n```console\n$ txt2regex --history '111223445566778(9|9)3¤a¤bc¤de¤fg¤5¤:012345¤6¤:01234567¤7' --prog sed,vim,egrep,python,procmail\n Regex sed     : ^.a\\?bc[de]\\+[^fg]\\{5\\}[A-Za-z0-9_ \\t]\\{1,6\\}[[:alpha:][:lower:][:upper:][:digit:][:alnum:][:xdigit:][:blank:][:graph:]]\\{7,\\}\\(.*\\|.*\\)*\n Regex vim     : ^.a\\=bc[de]\\+[^fg]\\{5}[A-Za-z0-9_ \\t]\\{1,6}[[:alpha:][:lower:][:upper:][:digit:][:alnum:][:xdigit:][:blank:][:graph:]]\\{7,}\\(.*\\|.*\\)*\n Regex egrep   : ^.a?bc[de]+[^fg]{5}[A-Za-z0-9_ <TAB>]{1,6}[[:alpha:][:lower:][:upper:][:digit:][:alnum:][:xdigit:][:blank:][:graph:]]{7,}(.*|.*)*\n Regex python  : ^.a?bc[de]+[^fg]{5}[A-Za-z0-9_ \\t]{1,6}!!{7,}(.*|.*)*\n Regex procmail: ^.a?bc[de]+[^fg]!![A-Za-z0-9_ <TAB>]!!!!!!(.*|.*)*\n\n$\n```\n\nError handling:\n\n```console\n$ txt2regex --history | sed 1q | cut -d : -f 1\nusage\n$ txt2regex --history invalid --prog sed | sed 's/ $//'\n Regex sed:\n\n$ txt2regex --history 2 --prog sed | sed 's/ $//'\n Regex sed:\n\n$ txt2regex --history '1¤unused¤arguments' --prog sed | sed 's/ $//'\n Regex sed: ^\n\n$ txt2regex --history 11 --prog sed | sed 's/ $//'  # missing repetition argument\n Regex sed: ^.\n\n$ txt2regex --history 12 --prog sed | sed 's/ $//'  # missing char argument\n Regex sed: ^\n\n$ txt2regex --history 13 --prog sed | sed 's/ $//'  # missing string argument\n Regex sed: ^\n\n$ txt2regex --history 14 --prog sed | sed 's/ $//'  # missing list string argument\n Regex sed: ^[]\n\n$ txt2regex --history 16 --prog sed | sed 's/ $//'  # missing list choice argument\n Regex sed: ^[]\n\n$ txt2regex --history '16¤:' --prog sed | sed 's/ $//'  # empty list choice argument\n Regex sed: ^[]\n\n$ txt2regex --history '16¤:9' --prog sed | sed 's/ $//'  # out-of-range list choice argument\n Regex sed: ^[]\n\n$ txt2regex --history '124259¤a¤b¤5' --prog foo\nERROR: unknown program: foo\n$\n```\n\n## Option --make\n\nThere are some already made regexes that txt2regex can show, use `--make` to inform which one do you want to see.\n\n```console\n$ txt2regex --make date\n\n### date LEVEL 1: mm/dd/yyyy: matches from 00/00/0000 to 99/99/9999\n\n Regex python: [0-9]{2}/[0-9]{2}/[0-9]{4}\n Regex egrep : [0-9]{2}/[0-9]{2}/[0-9]{4}\n Regex grep  : [0-9]\\{2\\}/[0-9]\\{2\\}/[0-9]\\{4\\}\n Regex sed   : [0-9]\\{2\\}/[0-9]\\{2\\}/[0-9]\\{4\\}\n Regex vim   : [0-9]\\{2}/[0-9]\\{2}/[0-9]\\{4}\n Regex emacs : [0-9]\\\\{2\\\\}/[0-9]\\\\{2\\\\}/[0-9]\\\\{4\\\\}\n\n$\n```\n\nAdding `--prog` you can specify the exact list of programs to you want to be shown in the output:\n\n```console\n$ txt2regex --make date --prog sed,python,sed\n\n### date LEVEL 1: mm/dd/yyyy: matches from 00/00/0000 to 99/99/9999\n\n Regex sed   : [0-9]\\{2\\}/[0-9]\\{2\\}/[0-9]\\{4\\}\n Regex python: [0-9]{2}/[0-9]{2}/[0-9]{4}\n Regex sed   : [0-9]\\{2\\}/[0-9]\\{2\\}/[0-9]\\{4\\}\n\n$\n```\n\nAnother alternative is using `--all` to show the regex in the syntax of every program txt2regex knows about:\n\n```console\n$ txt2regex --make number2 --all\n\n### number LEVEL 2: level 1 plus optional float point\n\n Regex awk       : [+-]?[0-9]+(\\.[0-9]!!)?\n Regex chicken   : [+-]?[0-9]+(\\\\.[0-9]{2})?\n Regex ed        : [+-]\\?[0-9]\\+\\(\\.[0-9]\\{2\\}\\)\\?\n Regex egrep     : [+-]?[0-9]+(\\.[0-9]{2})?\n Regex emacs     : [+-]?[0-9]+\\\\(\\\\.[0-9]\\\\{2\\\\}\\\\)?\n Regex expect    : [+-]?[0-9]+(\\.[0-9]{2})?\n Regex find      : [+-]?[0-9]+(\\.[0-9]{2})?\n Regex gawk      : [+-]?[0-9]+(\\.[0-9]{2})?\n Regex grep      : [+-]\\?[0-9]\\+\\(\\.[0-9]\\{2\\}\\)\\?\n Regex javascript: [+-]?[0-9]+(\\.[0-9]{2})?\n Regex lex       : [+-]?[0-9]+(\\.[0-9]{2})?\n Regex mawk      : [+-]?[0-9]+(\\.[0-9]!!)?\n Regex mysql     : [+-]?[0-9]+(\\\\.[0-9]{2})?\n Regex perl      : [+-]?[0-9]+(\\.[0-9]{2})?\n Regex php       : [+-]?[0-9]+(\\\\.[0-9]{2})?\n Regex postgres  : [+-]?[0-9]+(\\.[0-9]{2})?\n Regex procmail  : [+-]?[0-9]+(\\.[0-9]!!)?\n Regex python    : [+-]?[0-9]+(\\.[0-9]{2})?\n Regex sed       : [+-]\\?[0-9]\\+\\(\\.[0-9]\\{2\\}\\)\\?\n Regex tcl       : [+-]?[0-9]+(\\.[0-9]{2})?\n Regex vi        : [+-]\\{0,1\\}[0-9]\\{1,\\}\\(\\.[0-9]\\{2\\}\\)\\{0,1\\}\n Regex vim       : [+-]\\=[0-9]\\+\\(\\.[0-9]\\{2}\\)\\=\n\n$\n```\n\nAvailable regexes to match dates: `date`, `date2` and `date3`:\n\n```console\n$ for x in date date2 date3; do txt2regex --make $x --prog python; done\n\n### date LEVEL 1: mm/dd/yyyy: matches from 00/00/0000 to 99/99/9999\n\n Regex python: [0-9]{2}/[0-9]{2}/[0-9]{4}\n\n\n### date LEVEL 2: mm/dd/yyyy: matches from 00/00/1000 to 19/39/2999\n\n Regex python: [01][0-9]/[0123][0-9]/[12][0-9]{3}\n\n\n### date LEVEL 3: mm/dd/yyyy: matches from 00/00/1000 to 12/31/2999\n\n Regex python: (0[0-9]|1[012])/(0[0-9]|[12][0-9]|3[01])/[12][0-9]{3}\n\n$\n```\n\nAvailable regexes to match time: `hour`, `hour2` and `hour3`:\n\n```console\n$ for x in hour hour2 hour3; do txt2regex --make $x --prog python; done\n\n### hour LEVEL 1: hh:mm: matches from 00:00 to 99:99\n\n Regex python: [0-9]{2}:[0-9]{2}\n\n\n### hour LEVEL 2: hh:mm: matches from 00:00 to 29:59\n\n Regex python: [012][0-9]:[012345][0-9]\n\n\n### hour LEVEL 3: hh:mm: matches from 00:00 to 23:59\n\n Regex python: ([01][0-9]|2[0123]):[012345][0-9]\n\n$\n```\n\nAvailable regexes to match numbers: `number`, `number2` and `number3`:\n\n```console\n$ for x in number number2 number3; do txt2regex --make $x --prog python; done\n\n### number LEVEL 1: integer, positive and negative\n\n Regex python: [+-]?[0-9]+\n\n\n### number LEVEL 2: level 1 plus optional float point\n\n Regex python: [+-]?[0-9]+(\\.[0-9]{2})?\n\n\n### number LEVEL 3: level 2 plus optional commas, like: 34,412,069.90\n\n Regex python: [+-]?[0-9]{1,3}(,[0-9]{3})*(\\.[0-9]{2})?\n\n$\n```\n\nError handling:\n\n```console\n$ txt2regex --make\nERROR: --make: \"\": invalid argument\nvalid names: date date2 date3 hour hour2 hour3 number number2 number3\n$ txt2regex --make foo\nERROR: --make: \"foo\": invalid argument\nvalid names: date date2 date3 hour hour2 hour3 number number2 number3\n$ txt2regex --make date --prog foo\n\n### date LEVEL 1: mm/dd/yyyy: matches from 00/00/0000 to 99/99/9999\n\nERROR: unknown program: foo\n$\n```\n\n## Invalid option\n\n```console\n$ txt2regex --foo | head -n 3 | sed '3 s/:.*//'\n--foo: invalid option\n\nusage\n$\n```\n\n## Not enough lines to draw the UI\n\n```console\n$ LINES=10 txt2regex --all | tail -n 3 | sed '1s/ [0-9][0-9]* / NN /g'\nYour terminal has NN lines, but txt2regex needs at least NN lines.\nIncrease the number of lines or select less programs using --prog.\nIf this line number detection is incorrect, export the LINES variable.\n$\n```\n\n## On quit, show --history and regex textual description\n\nThis is the same stress test used in the previous `--history` test, but this time feeding the commands via STDIN (simulating the user interaction) and checking only the last 3 lines of the final result.\n\n```console\n$ user_input='1112a23bc\\n4de\\n45fg\\n55\\n6abcdef.66\\n7abcdefgh.77\\n8(9|9)3..'\n$ printf \"$user_input\" | txt2regex --nocolor | tail -n 3 | sed '1 s/.*txt2/txt2/'\ntxt2regex --history '111223445566778(9|9)3¤a¤bc¤de¤fg¤5¤:012345¤6¤:01234567¤7'\n\nstart to match on the line beginning, followed by any character, repeated one times, followed by a specific character, repeated zero or one times, followed by a literal string {bc}, followed by an allowed characters list, repeated one or more times, followed by a forbidden characters list, repeated exactly 5 times, followed by a special combination {uppercase letters, lowercase letters, numbers, underscore, space, TAB}, repeated up to 6 times, followed by a POSIX combination {letters, lowercase letters, uppercase letters, numbers, letters and numbers, hexadecimal numbers, whitespaces, graphic chars}, repeated at least 7 times, followed by a ready regex {} (, followed by anything |, followed by anything ), repeated zero or more times.\n$\n```\n"
  },
  {
    "path": "tests/features.md",
    "content": "# Feature tests for txt2regex\n\nThis is file is both documentation and a test file, showing how some txt2regex features work in practice, with the command line options required to trigger them and their expected result.\n\nThe [clitest](https://github.com/aureliojargas/clitest) tool can identify and run all the commands listed here and check if their actual output matches the expected one. Just run `clitest tests/features.md`.\n\n## Setup\n\nMake sure all the commands use the same Bash version and the same txt2regex file.\n\n```console\n$ txt2regex() { bash ./txt2regex.sh \"$@\"; }\n$\n```\n\n## User input: Numbers — getNumber()\n\nWhen informing numbers and non-numbers (`a5!6` in this test) when prompted for a number, the non-numbers are silently removed.\n\n```console\n$ txt2regex --prog egrep --history '215¤a5!6'\n Regex egrep: .{56}\n\n$\n```\n\n## User input: Remove duplicated chars from [] — getCharList()\n\nWhen informing literal characters to be put inside a `[]` list, txt2regex will deduplicate those characters, because the repetition in this case is not meaningful (`[aabbcc]` is the same as `[abc]`).\n\n```console\n$ txt2regex --prog egrep --history '24¤aabbbcab'\n Regex egrep: [abc]\n\n$\n```\n\n## User input: Rearrange [] special elements — getCharList()\n\nWhen informing literal characters to be put inside a `[]` list, some special cases have to be handled:\n\n- `^` must not be the first char, otherwise it would mean a negated list\n- `-` must not be between two other chars, otherwise it would mean a range.\n- `]` must be the very first char, otherwise it would end the list prematurely.\n- `[` is not special since the list is already opened, nothing to be done in this case.\n\n```console\n$ txt2regex --prog egrep --history '24¤^abc'  # move ^ to the last position\n Regex egrep: [abc^]\n\n$ txt2regex --prog egrep --history '24¤a^bc'  # ^ is not special in the 2nd position\n Regex egrep: [a^bc]\n\n$ txt2regex --prog egrep --history '24¤a-bc'  # move - to the last position\n Regex egrep: [abc-]\n\n$ txt2regex --prog egrep --history '24¤-abc'  # - is not special in the 1st position\n Regex egrep: [-abc]\n\n$ txt2regex --prog egrep --history '24¤a]bc'  # move ] to the 1st position\n Regex egrep: []abc]\n\n$ txt2regex --prog egrep --history '24¤a[bc'  # [ is not special\n Regex egrep: [a[bc]\n\n$ txt2regex --prog egrep --history '24¤^a[b-c]'  # everything together\n Regex egrep: []a[bc^-]\n\n$\n```\n\n## User input: Escape \\ when inside [] — escCharList()\n\nIn some programs, it's required to escape the `\\` character when using it inside `[]` lists, making it `\\\\` or even `\\\\\\\\`.\n\n```console\n$ txt2regex --all --history '241¤\\'\n Regex awk       : [\\\\]\n Regex chicken   : [\\\\\\\\]\n Regex ed        : [\\]\n Regex egrep     : [\\]\n Regex emacs     : [\\\\\\\\]\n Regex expect    : [\\\\]\n Regex find      : [\\]\n Regex gawk      : [\\\\]\n Regex grep      : [\\]\n Regex javascript: [\\\\]\n Regex lex       : [\\\\]\n Regex mawk      : [\\\\]\n Regex mysql     : [\\\\\\\\]\n Regex perl      : [\\\\]\n Regex php       : [\\\\\\\\]\n Regex postgres  : [\\\\]\n Regex procmail  : [\\]\n Regex python    : [\\\\]\n Regex sed       : [\\]\n Regex tcl       : [\\\\]\n Regex vi        : [\\]\n Regex vim       : [\\\\]\n\n$\n```\n\n## User input: Escape special chars — escChar()\n\nThe user has typed `.*+?[]{}()|^$\\` as a literal string.\n\nEvery metacharacter should be escaped so it will match as a literal character.\n\n```console\n$ txt2regex --all --history '23¤.*+?[]{}()|^$\\'\n Regex awk       : \\.\\*\\+\\?\\[]{}\\(\\)\\|\\^\\$\\\\\n Regex chicken   : \\\\.\\\\*\\\\+\\\\?\\\\[]{}\\\\(\\\\)\\\\|\\\\^\\\\$\\\\\\\\\n Regex ed        : \\.\\*+?\\[]{}()|^$\\\\\n Regex egrep     : \\.\\*\\+\\?\\[]\\{}\\()\\|\\^\\$\\\\\n Regex emacs     : \\\\.\\\\*\\\\+\\\\?\\\\[]{}()|^$\\\\\\\\\n Regex expect    : \\.\\*\\+\\?\\[]\\{\\}\\(\\)\\|\\^\\$\\\\\n Regex find      : \\.\\*\\+\\?\\[]\\{}\\()\\|\\^\\$\\\\\n Regex gawk      : \\.\\*\\+\\?\\[]{}\\()\\|\\^\\$\\\\\n Regex grep      : \\.\\*+?\\[]{}()|^$\\\\\n Regex javascript: \\.\\*\\+\\?\\[]{}\\(\\)\\|\\^\\$\\\\\n Regex lex       : \\.\\*\\+\\?\\[]\\{\\}\\(\\)\\|^$\\\\\n Regex mawk      : \\.\\*\\+\\?\\[]{}\\(\\)\\|\\^\\$\\\\\n Regex mysql     : \\\\.\\\\*\\\\+\\\\?\\\\[]{}\\\\()\\\\|\\\\^\\\\$\\\\\\\\\n Regex perl      : \\.\\*\\+\\?\\[]\\{}\\(\\)\\|\\^\\$\\\\\n Regex php       : \\\\.\\\\*\\\\+\\\\?\\\\[]\\\\{}\\\\(\\\\)\\\\|\\\\^\\\\$\\\\\\\\\n Regex postgres  : \\.\\*\\+\\?\\[]{}\\(\\)\\|\\^\\$\\\\\n Regex procmail  : \\.\\*\\+\\?\\[]{}\\(\\)\\|\\^\\$\\\\\n Regex python    : \\.\\*\\+\\?\\[]\\{}\\(\\)\\|\\^\\$\\\\\n Regex sed       : \\.\\*+?\\[]{}()|^$\\\\\n Regex tcl       : \\.\\*\\+\\?\\[]\\{\\}\\(\\)\\|\\^\\$\\\\\n Regex vi        : \\.\\*+?\\[]{}()|^$\\\\\n Regex vim       : \\.\\*+?\\[]{}()|^$\\\\\n\n$\n```\n\nNow try some Bash special chars to make sure nothing will break. Those chars should not be escaped since they are not metacharacters.\n\n```console\n$ txt2regex --prog egrep --history '23¤#!&;/`\"%>'\n Regex egrep: #!&;/`\"%>\n\n$\n```\n\n## User input: Use all \"special combination\" options — getCombo()\n\nTurn on all the options under the \"a special combination\" menu.\n\n```console\n$ txt2regex --prog sed --history '26¤:012345'\n Regex sed: [A-Za-z0-9_ \\t]\n\n$\n```\n\n## User input: Use all POSIX options — getPosix()\n\nTurn on all the options under the \"a POSIX combination (locale aware)\" menu.\n\n```console\n$ txt2regex --prog egrep --history '27¤:01234567'\n Regex egrep: [[:alpha:][:lower:][:upper:][:digit:][:alnum:][:xdigit:][:blank:][:graph:]]\n\n$\n```\n\n## POSIX support — getHasPosix()\n\nIf the program does not support POSIX character classes, a `!!` string is shown instead.\n\n```console\n$ txt2regex --all --history '27¤:0'\n Regex awk       : [[:alpha:]]\n Regex chicken   : [[:alpha:]]\n Regex ed        : [[:alpha:]]\n Regex egrep     : [[:alpha:]]\n Regex emacs     : [[:alpha:]]\n Regex expect    : [[:alpha:]]\n Regex find      : [[:alpha:]]\n Regex gawk      : [[:alpha:]]\n Regex grep      : [[:alpha:]]\n Regex javascript: !!\n Regex lex       : [[:alpha:]]\n Regex mawk      : !!\n Regex mysql     : [[:alpha:]]\n Regex perl      : [[:alpha:]]\n Regex php       : [[:alpha:]]\n Regex postgres  : [[:alpha:]]\n Regex procmail  : !!\n Regex python    : !!\n Regex sed       : [[:alpha:]]\n Regex tcl       : [[:alpha:]]\n Regex vi        : [[:alpha:]]\n Regex vim       : [[:alpha:]]\n\n$\n```\n\n## Tab inside [] — getListTab()\n\nIf the program does not support using `\\t` inside `[]` lists to represent a tab character, a `<TAB>` string is shown instead.\n\nThis is a reminder for the user that this string must be replaced by a literal tab to be able to use the regex.\n\n```console\n$ txt2regex --all --history '26¤:5'\n Regex awk       : [\\t]\n Regex chicken   : [\\t]\n Regex ed        : [<TAB>]\n Regex egrep     : [<TAB>]\n Regex emacs     : [\\t]\n Regex expect    : [\\t]\n Regex find      : [<TAB>]\n Regex gawk      : [\\t]\n Regex grep      : [<TAB>]\n Regex javascript: [\\t]\n Regex lex       : [\\t]\n Regex mawk      : [\\t]\n Regex mysql     : [\\t]\n Regex perl      : [\\t]\n Regex php       : [\\t]\n Regex postgres  : [\\t]\n Regex procmail  : [<TAB>]\n Regex python    : [\\t]\n Regex sed       : [\\t]\n Regex tcl       : [\\t]\n Regex vi        : [<TAB>]\n Regex vim       : [\\t]\n\n$\n```\n"
  },
  {
    "path": "tests/regex-tester.sh",
    "content": "#!/bin/bash\n# regex-tester.sh\n#\n# Txt2regex needs to know regex-related information for each program it\n# supports. For example: the list of metacharacters, how to escape a\n# metacharacter to match it literally, availability of POSIX character\n# classes.\n#\n# Instead of relying in documentation to get that information, this\n# script calls the real programs with specially crafted regexes and\n# sample texts, verifying how those programs behave in \"real life\".\n#\n# The version information for each program is also extracted, so we can\n# have a record of how it behaved in that specific version.\n#\n# To have a permanent record, the output of this script is also saved to\n# this repository. This way we can detect changes in behavior when a\n# program version is updated.\n#\n# To avoid having to install specific software in the developer machine,\n# a Docker image is used to isolate all the necessary software and this\n# script is run inside that image.\n#\n# To run this script, use `make test-regex`.\n\n# Run this script in Bash \"strict mode\"\nset -e -u -o pipefail\n\n# Lots of glob-like chars here, let's avoid headaches\nset -o noglob\n\n# Set to 1 when debugging\ndebug=0\n\n# Always prefer the \"replace\" type when the program supports both\n# name, test_type\nprogram_data='\nawk             replace\nchicken         replace\ned              replace\negrep           match\nemacs           replace\nexpect          match\nfind            match\ngawk            replace\ngrep            match\njavascript      replace\nlex             match\nmawk            replace\nmysql           match\nperl            replace\nphp             replace\npostgres        replace\nprocmail        match\npython          replace\nsed             replace\ntcl             replace\nvi              replace\nvim             replace\n'\n\n# shellcheck disable=SC2016\n# txt2regex-id, regex, matches\ntest_data='\n# Tests for metacharacters: . [] ? * + {}\n-           ^a.$              ab\n-           ^[a]b$            ab\n-           ^[^b]b$           ab\n# False positive: \"b\\\\?\" matches \"b\" followed by zero \"\\\", so we use \"bx\\\\?\"\nS2          ^abx?$            ab\nS2          ^abx\\?$           ab\nS2          ^abx\\\\?$          ab\n# False positive: \"b\\\\*\" matches \"b\" followed by zero \"\\\", so we use \"bx\\\\*\"\nS2          ^abx*$            ab\nS2          ^abx\\*$           ab\nS2          ^abx\\\\*$          ab\nS2          ^ab+$             abb\nS2          ^ab\\+$            abb\nS2          ^ab\\\\+$           abb\nS2          ^ab{1}$           ab\nS2          ^ab\\{1}$          ab\nS2          ^ab\\{1\\}$         ab\nS2          ^ab\\\\{1\\\\}$       ab\nS2          ^ab{1,}$          abb\nS2          ^ab\\{1,}$         abb\nS2          ^ab\\{1,\\}$        abb\nS2          ^ab\\\\{1,\\\\}$      abb\nS2          ^ab{1,2}$         abb\nS2          ^ab\\{1,2}$        abb\nS2          ^ab\\{1,2\\}$       abb\nS2          ^ab\\\\{1,2\\\\}$     abb\n\n# Tests for ax_*[1,2,3] values: ( ) |\nax123       ^a(b)$            ab\nax123       ^a\\(b\\)$          ab\nax123       ^a\\\\(b\\\\)$        ab\nax123       ^(x|ab)$          ab\nax123       ^\\(x\\|ab\\)$       ab\nax123       ^\\\\(x\\\\|ab\\\\)$    ab\n\n# Test for ax_*[5] values: escaping metacharacters to match them literally\n# Avoid \\b since it is special in most tools, use \\_ instead\nax5         ^a\\_$             a\\_\nax5         ^a\\\\_$            a\\_\nax5         ^a\\\\\\\\_$          a\\_\nax5         ^a\\.b$            a.b\nax5         ^a\\\\.b$           a.b\nax5         ^a*b$             a*b\nax5         ^a\\*b$            a*b\nax5         ^a\\\\*b$           a*b\nax5         ^a[b$             a[b\nax5         ^a\\[b$            a[b\nax5         ^a\\\\[b$           a[b\nax5         ^a]b$             a]b\nax5         ^a\\]b$            a]b\nax5         ^a\\\\]b$           a]b\nax5         ^a{b$             a{b\nax5         ^a\\{b$            a{b\nax5         ^a\\\\{b$           a{b\nax5         ^a}b$             a}b\nax5         ^a\\}b$            a}b\nax5         ^a\\\\}b$           a}b\n# Extra tests for { and } together, which may give different results\nax5         ^a{5}b$           a{5}b\nax5         ^a\\{5\\}b$         a{5}b\nax5         ^a\\\\{5\\\\}b$       a{5}b\nax5         ^a(b$             a(b\nax5         ^a\\(b$            a(b\nax5         ^a\\\\(b$           a(b\nax5         ^a)b$             a)b\nax5         ^a\\)b$            a)b\nax5         ^a\\\\)b$           a)b\n# Grouping because ^a|b matches ^a partially when test_type=match\nax5         ^(a|b)$           (a|b)\nax5         ^\\(a\\|b\\)$        (a|b)\nax5         ^\\\\(a\\\\|b\\\\)$     (a|b)\nax5         ^a+b$             a+b\nax5         ^a\\+b$            a+b\nax5         ^a\\\\+b$           a+b\nax5         ^a?b$             a?b\nax5         ^a\\?b$            a?b\nax5         ^a\\\\?b$           a?b\n# Test ^ and $ being in the middle\nax5         ^a^b$             a^b\nax5         ^a\\^b$            a^b\nax5         ^a\\\\^b$           a^b\nax5         ^a$b$             a$b\nax5         ^a\\$b$            a$b\nax5         ^a\\\\$b$           a$b\n\n# Test for ax_*[6] values: must escape \\ inside [] to match it literally?\n# Avoid \\b since it is special in most tools, use \\_ instead\nax6         ^a[\\]_$           a\\_\nax6         ^a[\\\\]_$          a\\_\nax6         ^a[\\\\\\\\]_$        a\\_\n\n# Test for ax_*[7] values: POSIX support\nax7         ^a[[:alpha:]]$    ab\n\n# Test for ax_*[8] values: \\t inside [] matches a tab?\n# Note that <tab> will be replaced by a real tab character later\nax8         ^a[\\t]b$          a<tab>b\n'\n\nescape() { # a\\b\\c -> a\\\\b\\\\c\n    printf '%s' \"${1//\\\\/\\\\\\\\}\"\n}\n\n# General tips for writing test_<program> functions\n#\n# - Avoid creating temporary files.\n# - The output must be only one line, even in case of errors.\n# - Always use printf, not echo.\n# - When test_type=replace, the regex must be replaced by a single \"x\"\n#   and the result is returned as the output.\n# - When test_type=match, the original \"string\" argument should be\n#   returned as the output when there's a match.\n# - Always use raw strings (think Python's r\"...\") for the \"string\"\n#   argument so things like \"a\\t\" won't have the \"\\t\" part expanded to a\n#   tab, for example.\n# - When raw strings are not available, use escape(\"$2\") to make sure\n#   the program will get the correct \"string\" argument. For example,\n#   \"a\\t\" will turn into \"a\\\\t\", which means \"a\", \"\\\" and \"t\".\n# - Check the program's most common way of specifying regexes: as a\n#   string, as a raw string, inside slashes /.../, etc. The idea here is\n#   testing the exact regex that the user will normally type, in the\n#   most common way of doing it.\n# - Be careful on shell escaping, quoting and expansion. Using stdin is\n#   the safest (example: printf ... | program), since the shell will not\n#   touch the text coming from stdin. The second preferred form are\n#   inline arguments (example: program \"...\"). In both cases, pay\n#   attention to the \"string\" argument, which may require a call to\n#   escape() when there's no raw string support.\n# - The worst case is nested inlining, when a tool calls another and the\n#   argument may be processed twice. Avoid that, otherwise escape it.\n#   No: su -c \"psql -A -t -c \\\"SELECT ...\\\"\" postgres\n#   Yes: printf \"SELECT ...\" | su -c \"psql -A -t\" postgres\n\ntest_awk() { # regex string\n    printf '%s\\n' \"$2\" |\n        original-awk \"{ sub(/$1/, \\\"x\\\") ; print }\" 2>&1 |\n        head -n 1\n}\n\ntest_chicken() { # regex string\n    # No raw strings, this matches: (irregex-replace \"a.b\" \"a\\tb\" \"x\")\n    printf '(print (irregex-replace \"%s\" \"%s\" \"x\"))' \"$1\" \"$(escape \"$2\")\" |\n        csi -quiet -R irregex 2>&1 |\n        grep -E '^Error:|^Warning:|^x$' |\n        head -n 1\n}\n\ntest_ed() { # regex string\n    # Open empty file, insert the string, replace, print, quit\n    printf '%s\\n' 0a \"$2\" . \"1s/$1/x/\" 1p Q |\n        ed -s 2>&1 |\n        head -n 1\n}\n\ntest_emacs() { # regex string\n    # No raw strings, this matches: (replace-regexp-in-string \"a.b\" \"x\" \"a\\tb\")\n    emacs -Q -batch --eval \\\n        \"(message (replace-regexp-in-string \\\"$1\\\" \\\"x\\\" \\\"$(escape \"$2\")\\\"))\"\n}\n\ntest_expect() { # regex string\n    # https://stackoverflow.com/q/37252842/\n    printf '%s' \"$2\" | # Important: no \\n here so ab$ will match\n        expect -c \"expect -re {$1} {puts \\$expect_out(0,string)}\" 2>&1 |\n        head -n 1\n}\n\ntest_egrep() { # regex string\n    printf '%s\\n' \"$2\" | grep -E -o \"$1\"\n}\n\ntest_find() { # regex string\n    mkdir tmp.find.$$\n    cd tmp.find.$$\n    touch \"$2\"\n    # It's always a full line (path) match, so add ./ and remove ^ anchor\n    find . -regextype posix-extended -regex \"^\\./${1#^}\" 2>&1 |\n        sed 's,.*/,,'\n    cd ..\n    rm -rf tmp.find.$$\n}\n\ntest_gawk() { # regex string\n    printf '%s\\n' \"$2\" |\n        gawk \"{ sub(/$1/, \\\"x\\\") ; print }\" 2>&1 |\n        head -n 1\n}\n\ntest_grep() { # regex string\n    printf '%s\\n' \"$2\" | grep -o \"$1\"\n}\n\ntest_javascript() { # regex string\n    node --eval \"String.raw\\`$2\\`.replace(/$1/, 'x')\" --print 2>&1 |\n        head -n 1\n}\n\n# http://matt.might.net/articles/standalone-lexers-with-lex/\ntest_lex() { # regex string\n    {\n        # lex commands to just print the matched text\n        # Got from: https://en.wikipedia.org/wiki/Lex_(software)\n        printf '%s\\n' '%{'\n        printf '%s\\n' '#include <stdio.h>'\n        printf '%s\\n' '%}'\n        printf '%s\\n' '%option noyywrap'\n        printf '%s\\n' '%%'\n        printf '%s %s\\n' \"$1\" '{printf(\"%s\\n\", yytext);}'\n        printf '%s\\n' '.|\\n {}'\n        printf '%s\\n' '%%'\n        printf '%s\\n' 'int main(void){ yylex(); return 0; }'\n    } > tmp.lex.$$.l\n    {\n        flex -o tmp.lex.$$.yy.c tmp.lex.$$.l &&\n            gcc -o tmp.lex.$$.run tmp.lex.$$.yy.c &&\n            printf '%s\\n' \"$2\" | ./tmp.lex.$$.run\n    } 2>&1 | head -n 1\n    rm -f tmp.lex.$$.*\n}\n\ntest_mawk() { # regex string\n    printf '%s\\n' \"$2\" |\n        mawk \"{ sub(/$1/, \\\"x\\\") ; print }\" 2>&1 |\n        head -n 1\n}\n\ntest_mysql() { # regex string\n    local result\n\n    # Using match because replace is only supported in MySQL 8.0+\n    # https://stackoverflow.com/a/49925597/\n    # Strings are not raw, this matches: SELECT 'a\\tb' REGEXP 'a.b'\n    result=$(mysql --silent --execute \"SELECT '$(escape \"$2\")' REGEXP '$1'\")\n\n    case \"$result\" in\n        1)\n            # Matched, show the original string (test_type=match)\n            printf '%s\\n' \"$2\"\n            ;;\n        *)\n            printf '%s\\n' \"$result\"\n            ;;\n    esac\n}\n\ntest_perl() { # regex string\n    printf '%s\\n' \"$2\" | perl -pe \"s/$1/x/\"\n}\n\ntest_php() { # regex string\n    # Single quotes are not raw in PHP (\\' and \\\\ are special)\n    # https://www.php.net/manual/en/language.types.string.php\n    printf \"<?php echo preg_replace('/%s/', 'x', '%s'); ?>\" \\\n        \"$1\" \"$(escape \"$2\")\" |\n        php\n}\n\ntest_postgres() { # regex string\n    # Strings are raw, this matches: SELECT 'a\\tb' ~ 'a..b'\n    printf \"SELECT regexp_replace('%s', '%s', 'x');\" \"$2\" \"$1\" |\n        su -c \"psql -A -t\" postgres\n}\n\ntest_procmail() { # regex string\n    local result\n\n    {\n        printf '%s\\n' 'VERBOSE=y'    # show results of regex matching\n        printf '%s\\n' 'LOGFILE=/etc' # force error, log goes to STDERR\n        printf '%s\\n' ':0'           # start of a new recipe\n        printf '* %s\\n' \"$1\"         # the regex to match\n        printf '%s\\n' '/dev/null'    # avoid writing any file to disk\n    } > tmp.procmail.$$\n\n    # Sample output when the regex is matched:\n    #\n    # procmail: [20] Mon Apr 13 00:44:48 2020\n    # procmail: Assigning \"LOGFILE=/etc\"\n    # procmail: Opening \"/etc\"\n    # procmail: Error while writing to \"/etc\"\n    # procmail: Match on \"^a\"\n    # procmail: Assigning \"LASTFOLDER=/dev/null\"\n    # procmail: Opening \"/dev/null\"\n    #   Folder: /dev/null\n    result=$(\n        printf '%s\\n' \"$2\" |\n            procmail ./tmp.procmail.$$ 2>&1 |\n            grep -E '^procmail: (Match|No match|Invalid regexp)' |\n            sed 's/^procmail: //' |\n            head -n 1\n    )\n\n    case \"$result\" in\n        Match*)\n            # Matched, show the original string (test_type=match)\n            printf '%s\\n' \"$2\"\n            ;;\n        *)\n            printf '%s\\n' \"$result\"\n            ;;\n    esac\n\n    rm tmp.procmail.$$\n}\n\ntest_python() { # regex string\n    printf '%s\\n%s\\n%s\\n' \\\n        'import re' \\\n        \"try: print(re.sub(r'$1', 'x', r'$2'))\" \\\n        'except Exception as e: print(e)' | python3\n}\n\ntest_sed() { # regex string\n    printf '%s\\n' \"$2\" | sed -e \"s/$1/x/\"\n}\n\ntest_tcl() { # regex string\n    # shellcheck disable=SC2016\n    printf 'regsub -all {%s} \"%s\" \"x\" res; puts $res\\n' \"$1\" \"$(escape \"$2\")\" |\n        tclsh 2>&1 |\n        head -n 1\n}\n\ntest_vi() { # regex string\n    # Open empty file, insert the string, replace, print, quit\n    printf '%s\\n' 0a \"$2\" . \"1s/$1/x/\" 1p q! |\n        nvi -e -s |\n        head -n 1\n}\n\ntest_vim() { # regex string\n    # Open empty file, insert the string, replace, print, quit\n    printf '%s\\n' 0a \"$2\" . \"1s/$1/x/\" 1p q! |\n        vim --clean -n -e -s\n}\n\ntest_program() {\n    local program=\"$1\"\n    local test_type=\"$2\"\n\n    local expected\n    local regex\n    local result\n    local string\n    local tab=$'\\t'\n\n    # Special pre-tests tasks\n    case \"$program\" in\n        mysql)\n            # https://github.com/moby/moby/issues/34390\n            find /var/lib/mysql/mysql -exec touch -c -a {} +\n            service mysql start > /dev/null\n            ;;\n        postgres)\n            service postgresql start > /dev/null\n            ;;\n    esac\n\n    printf '%s\\n' \"$test_data\" | grep -v '^#' | grep . | while read -r id regex string; do\n        printf '%-14s%-10s%-20s%-10s' \"$program\" \"$id\" \"$regex\" \"$string\"\n\n        # Use a real tab character instead of the <tab> marker\n        string=\"${string/<tab>/$tab}\"\n\n        case \"$test_type\" in\n            match)\n                expected=\"$string\"\n                ;;\n            replace)\n                # The test_* functions that perform replace operations\n                # will always replace the matched regex to a single x\n                # letter.\n                expected=\"x\"\n                ;;\n            *)\n                printf 'test_program(): Unsupported test_type \"%s\"\\n' \"$test_type\"\n                exit 1\n                ;;\n        esac\n\n        # Run the match test in $program\n        case \"$program\" in\n            vi)\n                # Cannot redirect stderr when testing vi, otherwise it\n                # raises the \"inappropriate ioctl for device\" error\n                result=$(\"test_$program\" \"$regex\" \"$string\" || true)\n                ;;\n            *)\n                result=$(\"test_$program\" \"$regex\" \"$string\" 2>&1 || true)\n                ;;\n        esac\n\n        if test \"$debug\" -eq 1; then\n            printf '\"%s\" = \"%s\" ' \"$result\" \"$expected\"\n        fi\n\n        if test \"$result\" = \"$expected\"; then\n            printf 'OK\\n'\n        elif test -n \"$result\"; then\n            printf 'FAIL %s\\n' \"$result\"\n        else\n            printf 'FAIL\\n'\n        fi\n    done\n\n    # Special post-tests tasks\n    case \"$program\" in\n        mysql)\n            service mysql stop > /dev/null\n            ;;\n        postgres)\n            service postgresql stop > /dev/null\n            ;;\n    esac\n}\n\nshow_version() {\n    local program=\"$1\"\n\n    case \"$program\" in\n        awk)\n            original-awk --version\n            ;;\n        chicken)\n            csi -release | sed 's/^/CHICKEN /'\n            ;;\n        ed)\n            ed --version\n            ;;\n        egrep)\n            grep -E --version\n            ;;\n        emacs)\n            emacs --version | head -n 1\n            ;;\n        expect)\n            expect -v\n            ;;\n        find)\n            # shellcheck disable=SC2185\n            find --version\n            ;;\n        lex)\n            flex --version\n            ;;\n        gawk)\n            gawk --version | sed 's/,.*//'\n            ;;\n        grep)\n            grep --version\n            ;;\n        javascript)\n            node --version | sed 's/^/node /'\n            ;;\n        mawk)\n            mawk -W version 2>&1 | grep ^mawk | sed 's/,.*//'\n            ;;\n        mysql)\n            mysql --version | sed 's/,.*//'\n            ;;\n        perl)\n            perl --version | sed '2!d; s/).*//; s/.*(/perl /'\n            ;;\n        php)\n            php -v | sed ' s/ (.*//'\n            ;;\n        procmail)\n            procmail -v\n            ;;\n        postgres)\n            psql --version | sed 's/ (Ubuntu.*//'\n            ;;\n        python)\n            python3 --version\n            ;;\n        sed)\n            sed --version\n            ;;\n        tcl)\n            # shellcheck disable=SC2016\n            printf 'puts $tcl_version' | tclsh | sed 's/^/tcl /'\n            ;;\n        vi)\n            dpkg-query --showformat='${Package} ${Version}\\n' --show nvi\n            ;;\n        vim)\n            vim --version | sed 's/,.*/)/'\n            ;;\n        *)\n            printf 'show_version(): Unknown program \"%s\"\\n' \"$program\"\n            exit 1\n            ;;\n    esac 2>&1 | head -n 1\n}\n\nmain() {\n    local program\n    local skip=\n    local test_type\n    local user_program=\n\n    while test $# -gt 0; do\n        case \"$1\" in\n            --skip)\n                skip=\"$2\"\n                shift\n                ;;\n            *)\n                user_program=\"$1\"\n                ;;\n        esac\n        shift\n    done\n\n    # Restrict the available programs to the user's choice\n    test -n \"$user_program\" &&\n        program_data=$(printf '%s\\n' \"$program_data\" | grep \"^$user_program \")\n\n    # Show version and test results for all the available programs\n    printf '%s\\n' \"$program_data\" | grep . | while read -r program test_type; do\n\n        test \"$program\" = \"$skip\" && continue\n\n        printf '%s version: ' \"$program\"\n        show_version \"$program\" || true\n\n        test_program \"$program\" \"$test_type\"\n        printf '%s\\n' ----------------------------------------------------------\n    done\n}\n\nmain \"$@\"\n"
  },
  {
    "path": "tests/regex-tester.txt",
    "content": "awk version: awk version 20121220\nawk           -         ^a.$                ab        OK\nawk           -         ^[a]b$              ab        OK\nawk           -         ^[^b]b$             ab        OK\nawk           S2        ^abx?$              ab        OK\nawk           S2        ^abx\\?$             ab        FAIL ab\nawk           S2        ^abx\\\\?$            ab        FAIL ab\nawk           S2        ^abx*$              ab        OK\nawk           S2        ^abx\\*$             ab        FAIL ab\nawk           S2        ^abx\\\\*$            ab        FAIL ab\nawk           S2        ^ab+$               abb       OK\nawk           S2        ^ab\\+$              abb       FAIL abb\nawk           S2        ^ab\\\\+$             abb       FAIL abb\nawk           S2        ^ab{1}$             ab        FAIL ab\nawk           S2        ^ab\\{1}$            ab        FAIL ab\nawk           S2        ^ab\\{1\\}$           ab        FAIL ab\nawk           S2        ^ab\\\\{1\\\\}$         ab        FAIL ab\nawk           S2        ^ab{1,}$            abb       FAIL abb\nawk           S2        ^ab\\{1,}$           abb       FAIL abb\nawk           S2        ^ab\\{1,\\}$          abb       FAIL abb\nawk           S2        ^ab\\\\{1,\\\\}$        abb       FAIL abb\nawk           S2        ^ab{1,2}$           abb       FAIL abb\nawk           S2        ^ab\\{1,2}$          abb       FAIL abb\nawk           S2        ^ab\\{1,2\\}$         abb       FAIL abb\nawk           S2        ^ab\\\\{1,2\\\\}$       abb       FAIL abb\nawk           ax123     ^a(b)$              ab        OK\nawk           ax123     ^a\\(b\\)$            ab        FAIL ab\nawk           ax123     ^a\\\\(b\\\\)$          ab        FAIL ab\nawk           ax123     ^(x|ab)$            ab        OK\nawk           ax123     ^\\(x\\|ab\\)$         ab        FAIL ab\nawk           ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL ab\nawk           ax5       ^a\\_$               a\\_       FAIL a\\_\nawk           ax5       ^a\\\\_$              a\\_       OK\nawk           ax5       ^a\\\\\\\\_$            a\\_       FAIL a\\_\nawk           ax5       ^a\\.b$              a.b       OK\nawk           ax5       ^a\\\\.b$             a.b       FAIL a.b\nawk           ax5       ^a*b$               a*b       FAIL a*b\nawk           ax5       ^a\\*b$              a*b       OK\nawk           ax5       ^a\\\\*b$             a*b       FAIL a*b\nawk           ax5       ^a[b$               a[b       FAIL original-awk: nonterminated character class ^a[b$\nawk           ax5       ^a\\[b$              a[b       OK\nawk           ax5       ^a\\\\[b$             a[b       FAIL original-awk: nonterminated character class ^a\\\\[b$\nawk           ax5       ^a]b$               a]b       OK\nawk           ax5       ^a\\]b$              a]b       OK\nawk           ax5       ^a\\\\]b$             a]b       FAIL a]b\nawk           ax5       ^a{b$               a{b       OK\nawk           ax5       ^a\\{b$              a{b       OK\nawk           ax5       ^a\\\\{b$             a{b       FAIL a{b\nawk           ax5       ^a}b$               a}b       OK\nawk           ax5       ^a\\}b$              a}b       OK\nawk           ax5       ^a\\\\}b$             a}b       FAIL a}b\nawk           ax5       ^a{5}b$             a{5}b     OK\nawk           ax5       ^a\\{5\\}b$           a{5}b     OK\nawk           ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL a{5}b\nawk           ax5       ^a(b$               a(b       FAIL original-awk: syntax error in regular expression ^a(b$ at \nawk           ax5       ^a\\(b$              a(b       OK\nawk           ax5       ^a\\\\(b$             a(b       FAIL original-awk: syntax error in regular expression ^a\\\\(b$ at \nawk           ax5       ^a)b$               a)b       FAIL original-awk: syntax error in regular expression ^a)b$ at b$\nawk           ax5       ^a\\)b$              a)b       OK\nawk           ax5       ^a\\\\)b$             a)b       FAIL original-awk: syntax error in regular expression ^a\\\\)b$ at b$\nawk           ax5       ^(a|b)$             (a|b)     FAIL (a|b)\nawk           ax5       ^\\(a\\|b\\)$          (a|b)     OK\nawk           ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL (a|b)\nawk           ax5       ^a+b$               a+b       FAIL a+b\nawk           ax5       ^a\\+b$              a+b       OK\nawk           ax5       ^a\\\\+b$             a+b       FAIL a+b\nawk           ax5       ^a?b$               a?b       FAIL a?b\nawk           ax5       ^a\\?b$              a?b       OK\nawk           ax5       ^a\\\\?b$             a?b       FAIL a?b\nawk           ax5       ^a^b$               a^b       FAIL original-awk: syntax error in regular expression ^a^b$ at b$\nawk           ax5       ^a\\^b$              a^b       OK\nawk           ax5       ^a\\\\^b$             a^b       FAIL original-awk: syntax error in regular expression ^a\\\\^b$ at b$\nawk           ax5       ^a$b$               a$b       FAIL a$b\nawk           ax5       ^a\\$b$              a$b       OK\nawk           ax5       ^a\\\\$b$             a$b       FAIL a$b\nawk           ax6       ^a[\\]_$             a\\_       FAIL original-awk: nonterminated character class ^a[\\]_$\nawk           ax6       ^a[\\\\]_$            a\\_       OK\nawk           ax6       ^a[\\\\\\\\]_$          a\\_       OK\nawk           ax7       ^a[[:alpha:]]$      ab        OK\nawk           ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\nchicken version: CHICKEN 4.12.0\nchicken       -         ^a.$                ab        OK\nchicken       -         ^[a]b$              ab        OK\nchicken       -         ^[^b]b$             ab        OK\nchicken       S2        ^abx?$              ab        OK\nchicken       S2        ^abx\\?$             ab        FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\?\nchicken       S2        ^abx\\\\?$            ab        FAIL\nchicken       S2        ^abx*$              ab        OK\nchicken       S2        ^abx\\*$             ab        FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\*\nchicken       S2        ^abx\\\\*$            ab        FAIL\nchicken       S2        ^ab+$               abb       OK\nchicken       S2        ^ab\\+$              abb       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\+\nchicken       S2        ^ab\\\\+$             abb       FAIL\nchicken       S2        ^ab{1}$             ab        OK\nchicken       S2        ^ab\\{1}$            ab        FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\{\nchicken       S2        ^ab\\{1\\}$           ab        FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\{\nchicken       S2        ^ab\\\\{1\\\\}$         ab        FAIL\nchicken       S2        ^ab{1,}$            abb       OK\nchicken       S2        ^ab\\{1,}$           abb       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\{\nchicken       S2        ^ab\\{1,\\}$          abb       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\{\nchicken       S2        ^ab\\\\{1,\\\\}$        abb       FAIL\nchicken       S2        ^ab{1,2}$           abb       OK\nchicken       S2        ^ab\\{1,2}$          abb       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\{\nchicken       S2        ^ab\\{1,2\\}$         abb       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\{\nchicken       S2        ^ab\\\\{1,2\\\\}$       abb       FAIL\nchicken       ax123     ^a(b)$              ab        OK\nchicken       ax123     ^a\\(b\\)$            ab        FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\(\nchicken       ax123     ^a\\\\(b\\\\)$          ab        FAIL\nchicken       ax123     ^(x|ab)$            ab        OK\nchicken       ax123     ^\\(x\\|ab\\)$         ab        FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\(\nchicken       ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL\nchicken       ax5       ^a\\_$               a\\_       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\_\nchicken       ax5       ^a\\\\_$              a\\_       FAIL\nchicken       ax5       ^a\\\\\\\\_$            a\\_       OK\nchicken       ax5       ^a\\.b$              a.b       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\.\nchicken       ax5       ^a\\\\.b$             a.b       OK\nchicken       ax5       ^a*b$               a*b       FAIL\nchicken       ax5       ^a\\*b$              a*b       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\*\nchicken       ax5       ^a\\\\*b$             a*b       OK\nchicken       ax5       ^a[b$               a[b       FAIL Error: incomplete char set\nchicken       ax5       ^a\\[b$              a[b       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\[\nchicken       ax5       ^a\\\\[b$             a[b       OK\nchicken       ax5       ^a]b$               a]b       OK\nchicken       ax5       ^a\\]b$              a]b       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\]\nchicken       ax5       ^a\\\\]b$             a]b       OK\nchicken       ax5       ^a{b$               a{b       OK\nchicken       ax5       ^a\\{b$              a{b       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\{\nchicken       ax5       ^a\\\\{b$             a{b       OK\nchicken       ax5       ^a}b$               a}b       OK\nchicken       ax5       ^a\\}b$              a}b       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\}\nchicken       ax5       ^a\\\\}b$             a}b       OK\nchicken       ax5       ^a{5}b$             a{5}b     FAIL\nchicken       ax5       ^a\\{5\\}b$           a{5}b     FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\{\nchicken       ax5       ^a\\\\{5\\\\}b$         a{5}b     OK\nchicken       ax5       ^a(b$               a(b       FAIL Error: unterminated parenthesis in regexp: \"^a(b$\"\nchicken       ax5       ^a\\(b$              a(b       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\(\nchicken       ax5       ^a\\\\(b$             a(b       OK\nchicken       ax5       ^a)b$               a)b       FAIL Error: too many )'s in regexp: \"^a)b$\"\nchicken       ax5       ^a\\)b$              a)b       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\)\nchicken       ax5       ^a\\\\)b$             a)b       OK\nchicken       ax5       ^(a|b)$             (a|b)     FAIL\nchicken       ax5       ^\\(a\\|b\\)$          (a|b)     FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\(\nchicken       ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     OK\nchicken       ax5       ^a+b$               a+b       FAIL\nchicken       ax5       ^a\\+b$              a+b       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\+\nchicken       ax5       ^a\\\\+b$             a+b       OK\nchicken       ax5       ^a?b$               a?b       FAIL\nchicken       ax5       ^a\\?b$              a?b       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\?\nchicken       ax5       ^a\\\\?b$             a?b       OK\nchicken       ax5       ^a^b$               a^b       FAIL\nchicken       ax5       ^a\\^b$              a^b       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\^\nchicken       ax5       ^a\\\\^b$             a^b       OK\nchicken       ax5       ^a$b$               a$b       FAIL\nchicken       ax5       ^a\\$b$              a$b       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\$\nchicken       ax5       ^a\\\\$b$             a$b       OK\nchicken       ax6       ^a[\\]_$             a\\_       FAIL Warning: undefined escape sequence in string - probably forgot backslash: #\\]\nchicken       ax6       ^a[\\\\]_$            a\\_       FAIL Error: incomplete char set\nchicken       ax6       ^a[\\\\\\\\]_$          a\\_       OK\nchicken       ax7       ^a[[:alpha:]]$      ab        OK\nchicken       ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\ned version: GNU Ed 1.10\ned            -         ^a.$                ab        OK\ned            -         ^[a]b$              ab        OK\ned            -         ^[^b]b$             ab        OK\ned            S2        ^abx?$              ab        FAIL ?\ned            S2        ^abx\\?$             ab        OK\ned            S2        ^abx\\\\?$            ab        FAIL ?\ned            S2        ^abx*$              ab        OK\ned            S2        ^abx\\*$             ab        FAIL ?\ned            S2        ^abx\\\\*$            ab        FAIL ?\ned            S2        ^ab+$               abb       FAIL ?\ned            S2        ^ab\\+$              abb       OK\ned            S2        ^ab\\\\+$             abb       FAIL ?\ned            S2        ^ab{1}$             ab        FAIL ?\ned            S2        ^ab\\{1}$            ab        FAIL ?\ned            S2        ^ab\\{1\\}$           ab        OK\ned            S2        ^ab\\\\{1\\\\}$         ab        FAIL ?\ned            S2        ^ab{1,}$            abb       FAIL ?\ned            S2        ^ab\\{1,}$           abb       FAIL ?\ned            S2        ^ab\\{1,\\}$          abb       OK\ned            S2        ^ab\\\\{1,\\\\}$        abb       FAIL ?\ned            S2        ^ab{1,2}$           abb       FAIL ?\ned            S2        ^ab\\{1,2}$          abb       FAIL ?\ned            S2        ^ab\\{1,2\\}$         abb       OK\ned            S2        ^ab\\\\{1,2\\\\}$       abb       FAIL ?\ned            ax123     ^a(b)$              ab        FAIL ?\ned            ax123     ^a\\(b\\)$            ab        OK\ned            ax123     ^a\\\\(b\\\\)$          ab        FAIL ?\ned            ax123     ^(x|ab)$            ab        FAIL ?\ned            ax123     ^\\(x\\|ab\\)$         ab        OK\ned            ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL ?\ned            ax5       ^a\\_$               a\\_       FAIL ?\ned            ax5       ^a\\\\_$              a\\_       OK\ned            ax5       ^a\\\\\\\\_$            a\\_       FAIL ?\ned            ax5       ^a\\.b$              a.b       OK\ned            ax5       ^a\\\\.b$             a.b       FAIL ?\ned            ax5       ^a*b$               a*b       FAIL ?\ned            ax5       ^a\\*b$              a*b       OK\ned            ax5       ^a\\\\*b$             a*b       FAIL ?\ned            ax5       ^a[b$               a[b       FAIL ?\ned            ax5       ^a\\[b$              a[b       OK\ned            ax5       ^a\\\\[b$             a[b       FAIL ?\ned            ax5       ^a]b$               a]b       OK\ned            ax5       ^a\\]b$              a]b       OK\ned            ax5       ^a\\\\]b$             a]b       FAIL ?\ned            ax5       ^a{b$               a{b       OK\ned            ax5       ^a\\{b$              a{b       FAIL ?\ned            ax5       ^a\\\\{b$             a{b       FAIL ?\ned            ax5       ^a}b$               a}b       OK\ned            ax5       ^a\\}b$              a}b       OK\ned            ax5       ^a\\\\}b$             a}b       FAIL ?\ned            ax5       ^a{5}b$             a{5}b     OK\ned            ax5       ^a\\{5\\}b$           a{5}b     FAIL ?\ned            ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL ?\ned            ax5       ^a(b$               a(b       OK\ned            ax5       ^a\\(b$              a(b       FAIL ?\ned            ax5       ^a\\\\(b$             a(b       FAIL ?\ned            ax5       ^a)b$               a)b       OK\ned            ax5       ^a\\)b$              a)b       FAIL ?\ned            ax5       ^a\\\\)b$             a)b       FAIL ?\ned            ax5       ^(a|b)$             (a|b)     OK\ned            ax5       ^\\(a\\|b\\)$          (a|b)     FAIL ?\ned            ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL ?\ned            ax5       ^a+b$               a+b       OK\ned            ax5       ^a\\+b$              a+b       FAIL ?\ned            ax5       ^a\\\\+b$             a+b       FAIL ?\ned            ax5       ^a?b$               a?b       OK\ned            ax5       ^a\\?b$              a?b       FAIL ?\ned            ax5       ^a\\\\?b$             a?b       FAIL ?\ned            ax5       ^a^b$               a^b       OK\ned            ax5       ^a\\^b$              a^b       OK\ned            ax5       ^a\\\\^b$             a^b       FAIL ?\ned            ax5       ^a$b$               a$b       OK\ned            ax5       ^a\\$b$              a$b       OK\ned            ax5       ^a\\\\$b$             a$b       FAIL ?\ned            ax6       ^a[\\]_$             a\\_       OK\ned            ax6       ^a[\\\\]_$            a\\_       OK\ned            ax6       ^a[\\\\\\\\]_$          a\\_       OK\ned            ax7       ^a[[:alpha:]]$      ab        OK\ned            ax8       ^a[\\t]b$            a<tab>b   FAIL ?\n----------------------------------------------------------\negrep version: grep (GNU grep) 3.1\negrep         -         ^a.$                ab        OK\negrep         -         ^[a]b$              ab        OK\negrep         -         ^[^b]b$             ab        OK\negrep         S2        ^abx?$              ab        OK\negrep         S2        ^abx\\?$             ab        FAIL\negrep         S2        ^abx\\\\?$            ab        FAIL\negrep         S2        ^abx*$              ab        OK\negrep         S2        ^abx\\*$             ab        FAIL\negrep         S2        ^abx\\\\*$            ab        FAIL\negrep         S2        ^ab+$               abb       OK\negrep         S2        ^ab\\+$              abb       FAIL\negrep         S2        ^ab\\\\+$             abb       FAIL\negrep         S2        ^ab{1}$             ab        OK\negrep         S2        ^ab\\{1}$            ab        FAIL\negrep         S2        ^ab\\{1\\}$           ab        FAIL\negrep         S2        ^ab\\\\{1\\\\}$         ab        FAIL\negrep         S2        ^ab{1,}$            abb       OK\negrep         S2        ^ab\\{1,}$           abb       FAIL\negrep         S2        ^ab\\{1,\\}$          abb       FAIL\negrep         S2        ^ab\\\\{1,\\\\}$        abb       FAIL\negrep         S2        ^ab{1,2}$           abb       OK\negrep         S2        ^ab\\{1,2}$          abb       FAIL\negrep         S2        ^ab\\{1,2\\}$         abb       FAIL\negrep         S2        ^ab\\\\{1,2\\\\}$       abb       FAIL\negrep         ax123     ^a(b)$              ab        OK\negrep         ax123     ^a\\(b\\)$            ab        FAIL\negrep         ax123     ^a\\\\(b\\\\)$          ab        FAIL\negrep         ax123     ^(x|ab)$            ab        OK\negrep         ax123     ^\\(x\\|ab\\)$         ab        FAIL\negrep         ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL\negrep         ax5       ^a\\_$               a\\_       FAIL\negrep         ax5       ^a\\\\_$              a\\_       OK\negrep         ax5       ^a\\\\\\\\_$            a\\_       FAIL\negrep         ax5       ^a\\.b$              a.b       OK\negrep         ax5       ^a\\\\.b$             a.b       FAIL\negrep         ax5       ^a*b$               a*b       FAIL\negrep         ax5       ^a\\*b$              a*b       OK\negrep         ax5       ^a\\\\*b$             a*b       FAIL\negrep         ax5       ^a[b$               a[b       FAIL grep: Unmatched [ or [^\negrep         ax5       ^a\\[b$              a[b       OK\negrep         ax5       ^a\\\\[b$             a[b       FAIL grep: Unmatched [ or [^\negrep         ax5       ^a]b$               a]b       OK\negrep         ax5       ^a\\]b$              a]b       OK\negrep         ax5       ^a\\\\]b$             a]b       FAIL\negrep         ax5       ^a{b$               a{b       OK\negrep         ax5       ^a\\{b$              a{b       OK\negrep         ax5       ^a\\\\{b$             a{b       FAIL\negrep         ax5       ^a}b$               a}b       OK\negrep         ax5       ^a\\}b$              a}b       OK\negrep         ax5       ^a\\\\}b$             a}b       FAIL\negrep         ax5       ^a{5}b$             a{5}b     FAIL\negrep         ax5       ^a\\{5\\}b$           a{5}b     OK\negrep         ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL\negrep         ax5       ^a(b$               a(b       FAIL grep: Unmatched ( or \\(\negrep         ax5       ^a\\(b$              a(b       OK\negrep         ax5       ^a\\\\(b$             a(b       FAIL grep: Unmatched ( or \\(\negrep         ax5       ^a)b$               a)b       OK\negrep         ax5       ^a\\)b$              a)b       OK\negrep         ax5       ^a\\\\)b$             a)b       FAIL\negrep         ax5       ^(a|b)$             (a|b)     FAIL\negrep         ax5       ^\\(a\\|b\\)$          (a|b)     OK\negrep         ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL\negrep         ax5       ^a+b$               a+b       FAIL\negrep         ax5       ^a\\+b$              a+b       OK\negrep         ax5       ^a\\\\+b$             a+b       FAIL\negrep         ax5       ^a?b$               a?b       FAIL\negrep         ax5       ^a\\?b$              a?b       OK\negrep         ax5       ^a\\\\?b$             a?b       FAIL\negrep         ax5       ^a^b$               a^b       FAIL\negrep         ax5       ^a\\^b$              a^b       OK\negrep         ax5       ^a\\\\^b$             a^b       FAIL\negrep         ax5       ^a$b$               a$b       FAIL\negrep         ax5       ^a\\$b$              a$b       OK\negrep         ax5       ^a\\\\$b$             a$b       FAIL\negrep         ax6       ^a[\\]_$             a\\_       OK\negrep         ax6       ^a[\\\\]_$            a\\_       OK\negrep         ax6       ^a[\\\\\\\\]_$          a\\_       OK\negrep         ax7       ^a[[:alpha:]]$      ab        OK\negrep         ax8       ^a[\\t]b$            a<tab>b   FAIL\n----------------------------------------------------------\nemacs version: GNU Emacs 25.2.2\nemacs         -         ^a.$                ab        OK\nemacs         -         ^[a]b$              ab        OK\nemacs         -         ^[^b]b$             ab        OK\nemacs         S2        ^abx?$              ab        OK\nemacs         S2        ^abx\\?$             ab        OK\nemacs         S2        ^abx\\\\?$            ab        FAIL ab\nemacs         S2        ^abx*$              ab        OK\nemacs         S2        ^abx\\*$             ab        OK\nemacs         S2        ^abx\\\\*$            ab        FAIL ab\nemacs         S2        ^ab+$               abb       OK\nemacs         S2        ^ab\\+$              abb       OK\nemacs         S2        ^ab\\\\+$             abb       FAIL abb\nemacs         S2        ^ab{1}$             ab        FAIL ab\nemacs         S2        ^ab\\{1}$            ab        FAIL ab\nemacs         S2        ^ab\\{1\\}$           ab        FAIL ab\nemacs         S2        ^ab\\\\{1\\\\}$         ab        OK\nemacs         S2        ^ab{1,}$            abb       FAIL abb\nemacs         S2        ^ab\\{1,}$           abb       FAIL abb\nemacs         S2        ^ab\\{1,\\}$          abb       FAIL abb\nemacs         S2        ^ab\\\\{1,\\\\}$        abb       OK\nemacs         S2        ^ab{1,2}$           abb       FAIL abb\nemacs         S2        ^ab\\{1,2}$          abb       FAIL abb\nemacs         S2        ^ab\\{1,2\\}$         abb       FAIL abb\nemacs         S2        ^ab\\\\{1,2\\\\}$       abb       OK\nemacs         ax123     ^a(b)$              ab        FAIL ab\nemacs         ax123     ^a\\(b\\)$            ab        FAIL ab\nemacs         ax123     ^a\\\\(b\\\\)$          ab        OK\nemacs         ax123     ^(x|ab)$            ab        FAIL ab\nemacs         ax123     ^\\(x\\|ab\\)$         ab        FAIL ab\nemacs         ax123     ^\\\\(x\\\\|ab\\\\)$      ab        OK\nemacs         ax5       ^a\\_$               a\\_       FAIL a\\_\nemacs         ax5       ^a\\\\_$              a\\_       FAIL Invalid regexp: \"Invalid regular expression\"\nemacs         ax5       ^a\\\\\\\\_$            a\\_       OK\nemacs         ax5       ^a\\.b$              a.b       OK\nemacs         ax5       ^a\\\\.b$             a.b       OK\nemacs         ax5       ^a*b$               a*b       FAIL a*b\nemacs         ax5       ^a\\*b$              a*b       FAIL a*b\nemacs         ax5       ^a\\\\*b$             a*b       OK\nemacs         ax5       ^a[b$               a[b       FAIL Invalid regexp: \"Unmatched [ or [^\"\nemacs         ax5       ^a\\[b$              a[b       FAIL Invalid regexp: \"Unmatched [ or [^\"\nemacs         ax5       ^a\\\\[b$             a[b       OK\nemacs         ax5       ^a]b$               a]b       OK\nemacs         ax5       ^a\\]b$              a]b       OK\nemacs         ax5       ^a\\\\]b$             a]b       OK\nemacs         ax5       ^a{b$               a{b       OK\nemacs         ax5       ^a\\{b$              a{b       OK\nemacs         ax5       ^a\\\\{b$             a{b       FAIL Invalid regexp: \"Invalid content of \\\\{\\\\}\"\nemacs         ax5       ^a}b$               a}b       OK\nemacs         ax5       ^a\\}b$              a}b       OK\nemacs         ax5       ^a\\\\}b$             a}b       OK\nemacs         ax5       ^a{5}b$             a{5}b     OK\nemacs         ax5       ^a\\{5\\}b$           a{5}b     OK\nemacs         ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL a{5}b\nemacs         ax5       ^a(b$               a(b       OK\nemacs         ax5       ^a\\(b$              a(b       OK\nemacs         ax5       ^a\\\\(b$             a(b       FAIL Invalid regexp: \"Unmatched ( or \\\\(\"\nemacs         ax5       ^a)b$               a)b       OK\nemacs         ax5       ^a\\)b$              a)b       OK\nemacs         ax5       ^a\\\\)b$             a)b       FAIL Invalid regexp: \"Unmatched ) or \\\\)\"\nemacs         ax5       ^(a|b)$             (a|b)     OK\nemacs         ax5       ^\\(a\\|b\\)$          (a|b)     OK\nemacs         ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL (a|b)\nemacs         ax5       ^a+b$               a+b       FAIL a+b\nemacs         ax5       ^a\\+b$              a+b       FAIL a+b\nemacs         ax5       ^a\\\\+b$             a+b       OK\nemacs         ax5       ^a?b$               a?b       FAIL a?b\nemacs         ax5       ^a\\?b$              a?b       FAIL a?b\nemacs         ax5       ^a\\\\?b$             a?b       OK\nemacs         ax5       ^a^b$               a^b       OK\nemacs         ax5       ^a\\^b$              a^b       FAIL a^b\nemacs         ax5       ^a\\\\^b$             a^b       OK\nemacs         ax5       ^a$b$               a$b       OK\nemacs         ax5       ^a\\$b$              a$b       OK\nemacs         ax5       ^a\\\\$b$             a$b       OK\nemacs         ax6       ^a[\\]_$             a\\_       FAIL Invalid regexp: \"Unmatched [ or [^\"\nemacs         ax6       ^a[\\\\]_$            a\\_       OK\nemacs         ax6       ^a[\\\\\\\\]_$          a\\_       OK\nemacs         ax7       ^a[[:alpha:]]$      ab        OK\nemacs         ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\nexpect version: expect version 5.45.4\nexpect        -         ^a.$                ab        OK\nexpect        -         ^[a]b$              ab        OK\nexpect        -         ^[^b]b$             ab        OK\nexpect        S2        ^abx?$              ab        OK\nexpect        S2        ^abx\\?$             ab        FAIL\nexpect        S2        ^abx\\\\?$            ab        FAIL\nexpect        S2        ^abx*$              ab        OK\nexpect        S2        ^abx\\*$             ab        FAIL\nexpect        S2        ^abx\\\\*$            ab        FAIL\nexpect        S2        ^ab+$               abb       OK\nexpect        S2        ^ab\\+$              abb       FAIL\nexpect        S2        ^ab\\\\+$             abb       FAIL\nexpect        S2        ^ab{1}$             ab        OK\nexpect        S2        ^ab\\{1}$            ab        FAIL extra characters after close-brace\nexpect        S2        ^ab\\{1\\}$           ab        FAIL\nexpect        S2        ^ab\\\\{1\\\\}$         ab        FAIL couldn't compile regular expression pattern: invalid repetition count(s)\nexpect        S2        ^ab{1,}$            abb       OK\nexpect        S2        ^ab\\{1,}$           abb       FAIL extra characters after close-brace\nexpect        S2        ^ab\\{1,\\}$          abb       FAIL\nexpect        S2        ^ab\\\\{1,\\\\}$        abb       FAIL couldn't compile regular expression pattern: invalid repetition count(s)\nexpect        S2        ^ab{1,2}$           abb       OK\nexpect        S2        ^ab\\{1,2}$          abb       FAIL extra characters after close-brace\nexpect        S2        ^ab\\{1,2\\}$         abb       FAIL\nexpect        S2        ^ab\\\\{1,2\\\\}$       abb       FAIL couldn't compile regular expression pattern: invalid repetition count(s)\nexpect        ax123     ^a(b)$              ab        OK\nexpect        ax123     ^a\\(b\\)$            ab        FAIL\nexpect        ax123     ^a\\\\(b\\\\)$          ab        FAIL\nexpect        ax123     ^(x|ab)$            ab        OK\nexpect        ax123     ^\\(x\\|ab\\)$         ab        FAIL\nexpect        ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL\nexpect        ax5       ^a\\_$               a\\_       FAIL\nexpect        ax5       ^a\\\\_$              a\\_       OK\nexpect        ax5       ^a\\\\\\\\_$            a\\_       FAIL\nexpect        ax5       ^a\\.b$              a.b       OK\nexpect        ax5       ^a\\\\.b$             a.b       FAIL\nexpect        ax5       ^a*b$               a*b       FAIL\nexpect        ax5       ^a\\*b$              a*b       OK\nexpect        ax5       ^a\\\\*b$             a*b       FAIL\nexpect        ax5       ^a[b$               a[b       FAIL couldn't compile regular expression pattern: brackets [] not balanced\nexpect        ax5       ^a\\[b$              a[b       OK\nexpect        ax5       ^a\\\\[b$             a[b       FAIL couldn't compile regular expression pattern: brackets [] not balanced\nexpect        ax5       ^a]b$               a]b       OK\nexpect        ax5       ^a\\]b$              a]b       OK\nexpect        ax5       ^a\\\\]b$             a]b       FAIL\nexpect        ax5       ^a{b$               a{b       FAIL missing close-brace\nexpect        ax5       ^a\\{b$              a{b       OK\nexpect        ax5       ^a\\\\{b$             a{b       FAIL missing close-brace\nexpect        ax5       ^a}b$               a}b       FAIL extra characters after close-brace\nexpect        ax5       ^a\\}b$              a}b       OK\nexpect        ax5       ^a\\\\}b$             a}b       FAIL extra characters after close-brace\nexpect        ax5       ^a{5}b$             a{5}b     FAIL\nexpect        ax5       ^a\\{5\\}b$           a{5}b     OK\nexpect        ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL couldn't compile regular expression pattern: invalid repetition count(s)\nexpect        ax5       ^a(b$               a(b       FAIL couldn't compile regular expression pattern: parentheses () not balanced\nexpect        ax5       ^a\\(b$              a(b       OK\nexpect        ax5       ^a\\\\(b$             a(b       FAIL couldn't compile regular expression pattern: parentheses () not balanced\nexpect        ax5       ^a)b$               a)b       FAIL couldn't compile regular expression pattern: parentheses () not balanced\nexpect        ax5       ^a\\)b$              a)b       OK\nexpect        ax5       ^a\\\\)b$             a)b       FAIL couldn't compile regular expression pattern: parentheses () not balanced\nexpect        ax5       ^(a|b)$             (a|b)     FAIL\nexpect        ax5       ^\\(a\\|b\\)$          (a|b)     OK\nexpect        ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL\nexpect        ax5       ^a+b$               a+b       FAIL\nexpect        ax5       ^a\\+b$              a+b       OK\nexpect        ax5       ^a\\\\+b$             a+b       FAIL\nexpect        ax5       ^a?b$               a?b       FAIL\nexpect        ax5       ^a\\?b$              a?b       OK\nexpect        ax5       ^a\\\\?b$             a?b       FAIL\nexpect        ax5       ^a^b$               a^b       FAIL\nexpect        ax5       ^a\\^b$              a^b       OK\nexpect        ax5       ^a\\\\^b$             a^b       FAIL\nexpect        ax5       ^a$b$               a$b       FAIL\nexpect        ax5       ^a\\$b$              a$b       OK\nexpect        ax5       ^a\\\\$b$             a$b       FAIL\nexpect        ax6       ^a[\\]_$             a\\_       FAIL couldn't compile regular expression pattern: brackets [] not balanced\nexpect        ax6       ^a[\\\\]_$            a\\_       OK\nexpect        ax6       ^a[\\\\\\\\]_$          a\\_       OK\nexpect        ax7       ^a[[:alpha:]]$      ab        OK\nexpect        ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\nfind version: find (GNU findutils) 4.7.0-git\nfind          -         ^a.$                ab        OK\nfind          -         ^[a]b$              ab        OK\nfind          -         ^[^b]b$             ab        OK\nfind          S2        ^abx?$              ab        OK\nfind          S2        ^abx\\?$             ab        FAIL\nfind          S2        ^abx\\\\?$            ab        FAIL\nfind          S2        ^abx*$              ab        OK\nfind          S2        ^abx\\*$             ab        FAIL\nfind          S2        ^abx\\\\*$            ab        FAIL\nfind          S2        ^ab+$               abb       OK\nfind          S2        ^ab\\+$              abb       FAIL\nfind          S2        ^ab\\\\+$             abb       FAIL\nfind          S2        ^ab{1}$             ab        OK\nfind          S2        ^ab\\{1}$            ab        FAIL\nfind          S2        ^ab\\{1\\}$           ab        FAIL\nfind          S2        ^ab\\\\{1\\\\}$         ab        FAIL ab\\\\{1\\\\}$': Invalid content of \\{\\}\nfind          S2        ^ab{1,}$            abb       OK\nfind          S2        ^ab\\{1,}$           abb       FAIL\nfind          S2        ^ab\\{1,\\}$          abb       FAIL\nfind          S2        ^ab\\\\{1,\\\\}$        abb       FAIL ab\\\\{1,\\\\}$': Invalid content of \\{\\}\nfind          S2        ^ab{1,2}$           abb       OK\nfind          S2        ^ab\\{1,2}$          abb       FAIL\nfind          S2        ^ab\\{1,2\\}$         abb       FAIL\nfind          S2        ^ab\\\\{1,2\\\\}$       abb       FAIL ab\\\\{1,2\\\\}$': Invalid content of \\{\\}\nfind          ax123     ^a(b)$              ab        OK\nfind          ax123     ^a\\(b\\)$            ab        FAIL\nfind          ax123     ^a\\\\(b\\\\)$          ab        FAIL\nfind          ax123     ^(x|ab)$            ab        OK\nfind          ax123     ^\\(x\\|ab\\)$         ab        FAIL\nfind          ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL\nfind          ax5       ^a\\_$               a\\_       FAIL\nfind          ax5       ^a\\\\_$              a\\_       OK\nfind          ax5       ^a\\\\\\\\_$            a\\_       FAIL\nfind          ax5       ^a\\.b$              a.b       OK\nfind          ax5       ^a\\\\.b$             a.b       FAIL\nfind          ax5       ^a*b$               a*b       FAIL\nfind          ax5       ^a\\*b$              a*b       OK\nfind          ax5       ^a\\\\*b$             a*b       FAIL\nfind          ax5       ^a[b$               a[b       FAIL a[b$': Unmatched [ or [^\nfind          ax5       ^a\\[b$              a[b       OK\nfind          ax5       ^a\\\\[b$             a[b       FAIL a\\\\[b$': Unmatched [ or [^\nfind          ax5       ^a]b$               a]b       OK\nfind          ax5       ^a\\]b$              a]b       OK\nfind          ax5       ^a\\\\]b$             a]b       FAIL\nfind          ax5       ^a{b$               a{b       FAIL a{b$': Unmatched \\{\nfind          ax5       ^a\\{b$              a{b       OK\nfind          ax5       ^a\\\\{b$             a{b       FAIL a\\\\{b$': Unmatched \\{\nfind          ax5       ^a}b$               a}b       OK\nfind          ax5       ^a\\}b$              a}b       OK\nfind          ax5       ^a\\\\}b$             a}b       FAIL\nfind          ax5       ^a{5}b$             a{5}b     FAIL\nfind          ax5       ^a\\{5\\}b$           a{5}b     OK\nfind          ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL a\\\\{5\\\\}b$': Invalid content of \\{\\}\nfind          ax5       ^a(b$               a(b       FAIL a(b$': Unmatched ( or \\(\nfind          ax5       ^a\\(b$              a(b       OK\nfind          ax5       ^a\\\\(b$             a(b       FAIL a\\\\(b$': Unmatched ( or \\(\nfind          ax5       ^a)b$               a)b       OK\nfind          ax5       ^a\\)b$              a)b       OK\nfind          ax5       ^a\\\\)b$             a)b       FAIL\nfind          ax5       ^(a|b)$             (a|b)     FAIL\nfind          ax5       ^\\(a\\|b\\)$          (a|b)     OK\nfind          ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL\nfind          ax5       ^a+b$               a+b       FAIL\nfind          ax5       ^a\\+b$              a+b       OK\nfind          ax5       ^a\\\\+b$             a+b       FAIL\nfind          ax5       ^a?b$               a?b       FAIL\nfind          ax5       ^a\\?b$              a?b       OK\nfind          ax5       ^a\\\\?b$             a?b       FAIL\nfind          ax5       ^a^b$               a^b       FAIL\nfind          ax5       ^a\\^b$              a^b       OK\nfind          ax5       ^a\\\\^b$             a^b       FAIL\nfind          ax5       ^a$b$               a$b       FAIL\nfind          ax5       ^a\\$b$              a$b       OK\nfind          ax5       ^a\\\\$b$             a$b       FAIL\nfind          ax6       ^a[\\]_$             a\\_       OK\nfind          ax6       ^a[\\\\]_$            a\\_       OK\nfind          ax6       ^a[\\\\\\\\]_$          a\\_       OK\nfind          ax7       ^a[[:alpha:]]$      ab        OK\nfind          ax8       ^a[\\t]b$            a<tab>b   FAIL\n----------------------------------------------------------\ngawk version: GNU Awk 4.1.4\ngawk          -         ^a.$                ab        OK\ngawk          -         ^[a]b$              ab        OK\ngawk          -         ^[^b]b$             ab        OK\ngawk          S2        ^abx?$              ab        OK\ngawk          S2        ^abx\\?$             ab        FAIL ab\ngawk          S2        ^abx\\\\?$            ab        FAIL ab\ngawk          S2        ^abx*$              ab        OK\ngawk          S2        ^abx\\*$             ab        FAIL ab\ngawk          S2        ^abx\\\\*$            ab        FAIL ab\ngawk          S2        ^ab+$               abb       OK\ngawk          S2        ^ab\\+$              abb       FAIL abb\ngawk          S2        ^ab\\\\+$             abb       FAIL abb\ngawk          S2        ^ab{1}$             ab        OK\ngawk          S2        ^ab\\{1}$            ab        FAIL ab\ngawk          S2        ^ab\\{1\\}$           ab        FAIL ab\ngawk          S2        ^ab\\\\{1\\\\}$         ab        FAIL ab\ngawk          S2        ^ab{1,}$            abb       OK\ngawk          S2        ^ab\\{1,}$           abb       FAIL abb\ngawk          S2        ^ab\\{1,\\}$          abb       FAIL abb\ngawk          S2        ^ab\\\\{1,\\\\}$        abb       FAIL abb\ngawk          S2        ^ab{1,2}$           abb       OK\ngawk          S2        ^ab\\{1,2}$          abb       FAIL abb\ngawk          S2        ^ab\\{1,2\\}$         abb       FAIL abb\ngawk          S2        ^ab\\\\{1,2\\\\}$       abb       FAIL abb\ngawk          ax123     ^a(b)$              ab        OK\ngawk          ax123     ^a\\(b\\)$            ab        FAIL ab\ngawk          ax123     ^a\\\\(b\\\\)$          ab        FAIL ab\ngawk          ax123     ^(x|ab)$            ab        OK\ngawk          ax123     ^\\(x\\|ab\\)$         ab        FAIL ab\ngawk          ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL ab\ngawk          ax5       ^a\\_$               a\\_       FAIL a\\_\ngawk          ax5       ^a\\\\_$              a\\_       OK\ngawk          ax5       ^a\\\\\\\\_$            a\\_       FAIL a\\_\ngawk          ax5       ^a\\.b$              a.b       OK\ngawk          ax5       ^a\\\\.b$             a.b       FAIL a.b\ngawk          ax5       ^a*b$               a*b       FAIL a*b\ngawk          ax5       ^a\\*b$              a*b       OK\ngawk          ax5       ^a\\\\*b$             a*b       FAIL a*b\ngawk          ax5       ^a[b$               a[b       FAIL gawk: cmd. line:1: { sub(/^a[b$/, \"x\") ; print }\ngawk          ax5       ^a\\[b$              a[b       OK\ngawk          ax5       ^a\\\\[b$             a[b       FAIL gawk: cmd. line:1: { sub(/^a\\\\[b$/, \"x\") ; print }\ngawk          ax5       ^a]b$               a]b       OK\ngawk          ax5       ^a\\]b$              a]b       OK\ngawk          ax5       ^a\\\\]b$             a]b       FAIL a]b\ngawk          ax5       ^a{b$               a{b       OK\ngawk          ax5       ^a\\{b$              a{b       OK\ngawk          ax5       ^a\\\\{b$             a{b       FAIL a{b\ngawk          ax5       ^a}b$               a}b       OK\ngawk          ax5       ^a\\}b$              a}b       OK\ngawk          ax5       ^a\\\\}b$             a}b       FAIL a}b\ngawk          ax5       ^a{5}b$             a{5}b     FAIL a{5}b\ngawk          ax5       ^a\\{5\\}b$           a{5}b     OK\ngawk          ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL a{5}b\ngawk          ax5       ^a(b$               a(b       FAIL gawk: cmd. line:1: error: Unmatched ( or \\(: /^a(b$/\ngawk          ax5       ^a\\(b$              a(b       OK\ngawk          ax5       ^a\\\\(b$             a(b       FAIL gawk: cmd. line:1: error: Unmatched ( or \\(: /^a\\\\(b$/\ngawk          ax5       ^a)b$               a)b       OK\ngawk          ax5       ^a\\)b$              a)b       OK\ngawk          ax5       ^a\\\\)b$             a)b       FAIL a)b\ngawk          ax5       ^(a|b)$             (a|b)     FAIL (a|b)\ngawk          ax5       ^\\(a\\|b\\)$          (a|b)     OK\ngawk          ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL (a|b)\ngawk          ax5       ^a+b$               a+b       FAIL a+b\ngawk          ax5       ^a\\+b$              a+b       OK\ngawk          ax5       ^a\\\\+b$             a+b       FAIL a+b\ngawk          ax5       ^a?b$               a?b       FAIL a?b\ngawk          ax5       ^a\\?b$              a?b       OK\ngawk          ax5       ^a\\\\?b$             a?b       FAIL a?b\ngawk          ax5       ^a^b$               a^b       FAIL a^b\ngawk          ax5       ^a\\^b$              a^b       OK\ngawk          ax5       ^a\\\\^b$             a^b       FAIL a^b\ngawk          ax5       ^a$b$               a$b       FAIL a$b\ngawk          ax5       ^a\\$b$              a$b       OK\ngawk          ax5       ^a\\\\$b$             a$b       FAIL a$b\ngawk          ax6       ^a[\\]_$             a\\_       FAIL gawk: cmd. line:1: { sub(/^a[\\]_$/, \"x\") ; print }\ngawk          ax6       ^a[\\\\]_$            a\\_       OK\ngawk          ax6       ^a[\\\\\\\\]_$          a\\_       OK\ngawk          ax7       ^a[[:alpha:]]$      ab        OK\ngawk          ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\ngrep version: grep (GNU grep) 3.1\ngrep          -         ^a.$                ab        OK\ngrep          -         ^[a]b$              ab        OK\ngrep          -         ^[^b]b$             ab        OK\ngrep          S2        ^abx?$              ab        FAIL\ngrep          S2        ^abx\\?$             ab        OK\ngrep          S2        ^abx\\\\?$            ab        FAIL\ngrep          S2        ^abx*$              ab        OK\ngrep          S2        ^abx\\*$             ab        FAIL\ngrep          S2        ^abx\\\\*$            ab        FAIL\ngrep          S2        ^ab+$               abb       FAIL\ngrep          S2        ^ab\\+$              abb       OK\ngrep          S2        ^ab\\\\+$             abb       FAIL\ngrep          S2        ^ab{1}$             ab        FAIL\ngrep          S2        ^ab\\{1}$            ab        FAIL grep: Unmatched \\{\ngrep          S2        ^ab\\{1\\}$           ab        OK\ngrep          S2        ^ab\\\\{1\\\\}$         ab        FAIL\ngrep          S2        ^ab{1,}$            abb       FAIL\ngrep          S2        ^ab\\{1,}$           abb       FAIL grep: Unmatched \\{\ngrep          S2        ^ab\\{1,\\}$          abb       OK\ngrep          S2        ^ab\\\\{1,\\\\}$        abb       FAIL\ngrep          S2        ^ab{1,2}$           abb       FAIL\ngrep          S2        ^ab\\{1,2}$          abb       FAIL grep: Unmatched \\{\ngrep          S2        ^ab\\{1,2\\}$         abb       OK\ngrep          S2        ^ab\\\\{1,2\\\\}$       abb       FAIL\ngrep          ax123     ^a(b)$              ab        FAIL\ngrep          ax123     ^a\\(b\\)$            ab        OK\ngrep          ax123     ^a\\\\(b\\\\)$          ab        FAIL\ngrep          ax123     ^(x|ab)$            ab        FAIL\ngrep          ax123     ^\\(x\\|ab\\)$         ab        OK\ngrep          ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL\ngrep          ax5       ^a\\_$               a\\_       FAIL\ngrep          ax5       ^a\\\\_$              a\\_       OK\ngrep          ax5       ^a\\\\\\\\_$            a\\_       FAIL\ngrep          ax5       ^a\\.b$              a.b       OK\ngrep          ax5       ^a\\\\.b$             a.b       FAIL\ngrep          ax5       ^a*b$               a*b       FAIL\ngrep          ax5       ^a\\*b$              a*b       OK\ngrep          ax5       ^a\\\\*b$             a*b       FAIL\ngrep          ax5       ^a[b$               a[b       FAIL grep: Unmatched [ or [^\ngrep          ax5       ^a\\[b$              a[b       OK\ngrep          ax5       ^a\\\\[b$             a[b       FAIL grep: Unmatched [ or [^\ngrep          ax5       ^a]b$               a]b       OK\ngrep          ax5       ^a\\]b$              a]b       OK\ngrep          ax5       ^a\\\\]b$             a]b       FAIL\ngrep          ax5       ^a{b$               a{b       OK\ngrep          ax5       ^a\\{b$              a{b       FAIL grep: Unmatched \\{\ngrep          ax5       ^a\\\\{b$             a{b       FAIL\ngrep          ax5       ^a}b$               a}b       OK\ngrep          ax5       ^a\\}b$              a}b       OK\ngrep          ax5       ^a\\\\}b$             a}b       FAIL\ngrep          ax5       ^a{5}b$             a{5}b     OK\ngrep          ax5       ^a\\{5\\}b$           a{5}b     FAIL\ngrep          ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL\ngrep          ax5       ^a(b$               a(b       OK\ngrep          ax5       ^a\\(b$              a(b       FAIL grep: Unmatched ( or \\(\ngrep          ax5       ^a\\\\(b$             a(b       FAIL\ngrep          ax5       ^a)b$               a)b       OK\ngrep          ax5       ^a\\)b$              a)b       FAIL grep: Unmatched ) or \\)\ngrep          ax5       ^a\\\\)b$             a)b       FAIL\ngrep          ax5       ^(a|b)$             (a|b)     OK\ngrep          ax5       ^\\(a\\|b\\)$          (a|b)     FAIL\ngrep          ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL\ngrep          ax5       ^a+b$               a+b       OK\ngrep          ax5       ^a\\+b$              a+b       FAIL\ngrep          ax5       ^a\\\\+b$             a+b       FAIL\ngrep          ax5       ^a?b$               a?b       OK\ngrep          ax5       ^a\\?b$              a?b       FAIL\ngrep          ax5       ^a\\\\?b$             a?b       FAIL\ngrep          ax5       ^a^b$               a^b       OK\ngrep          ax5       ^a\\^b$              a^b       OK\ngrep          ax5       ^a\\\\^b$             a^b       FAIL\ngrep          ax5       ^a$b$               a$b       OK\ngrep          ax5       ^a\\$b$              a$b       OK\ngrep          ax5       ^a\\\\$b$             a$b       FAIL\ngrep          ax6       ^a[\\]_$             a\\_       OK\ngrep          ax6       ^a[\\\\]_$            a\\_       OK\ngrep          ax6       ^a[\\\\\\\\]_$          a\\_       OK\ngrep          ax7       ^a[[:alpha:]]$      ab        OK\ngrep          ax8       ^a[\\t]b$            a<tab>b   FAIL\n----------------------------------------------------------\njavascript version: node v8.10.0\njavascript    -         ^a.$                ab        OK\njavascript    -         ^[a]b$              ab        OK\njavascript    -         ^[^b]b$             ab        OK\njavascript    S2        ^abx?$              ab        OK\njavascript    S2        ^abx\\?$             ab        FAIL ab\njavascript    S2        ^abx\\\\?$            ab        FAIL ab\njavascript    S2        ^abx*$              ab        OK\njavascript    S2        ^abx\\*$             ab        FAIL ab\njavascript    S2        ^abx\\\\*$            ab        FAIL ab\njavascript    S2        ^ab+$               abb       OK\njavascript    S2        ^ab\\+$              abb       FAIL abb\njavascript    S2        ^ab\\\\+$             abb       FAIL abb\njavascript    S2        ^ab{1}$             ab        OK\njavascript    S2        ^ab\\{1}$            ab        FAIL ab\njavascript    S2        ^ab\\{1\\}$           ab        FAIL ab\njavascript    S2        ^ab\\\\{1\\\\}$         ab        FAIL ab\njavascript    S2        ^ab{1,}$            abb       OK\njavascript    S2        ^ab\\{1,}$           abb       FAIL abb\njavascript    S2        ^ab\\{1,\\}$          abb       FAIL abb\njavascript    S2        ^ab\\\\{1,\\\\}$        abb       FAIL abb\njavascript    S2        ^ab{1,2}$           abb       OK\njavascript    S2        ^ab\\{1,2}$          abb       FAIL abb\njavascript    S2        ^ab\\{1,2\\}$         abb       FAIL abb\njavascript    S2        ^ab\\\\{1,2\\\\}$       abb       FAIL abb\njavascript    ax123     ^a(b)$              ab        OK\njavascript    ax123     ^a\\(b\\)$            ab        FAIL ab\njavascript    ax123     ^a\\\\(b\\\\)$          ab        FAIL ab\njavascript    ax123     ^(x|ab)$            ab        OK\njavascript    ax123     ^\\(x\\|ab\\)$         ab        FAIL ab\njavascript    ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL ab\njavascript    ax5       ^a\\_$               a\\_       FAIL a\\_\njavascript    ax5       ^a\\\\_$              a\\_       OK\njavascript    ax5       ^a\\\\\\\\_$            a\\_       FAIL a\\_\njavascript    ax5       ^a\\.b$              a.b       OK\njavascript    ax5       ^a\\\\.b$             a.b       FAIL a.b\njavascript    ax5       ^a*b$               a*b       FAIL a*b\njavascript    ax5       ^a\\*b$              a*b       OK\njavascript    ax5       ^a\\\\*b$             a*b       FAIL a*b\njavascript    ax5       ^a[b$               a[b       FAIL [eval]:1\njavascript    ax5       ^a\\[b$              a[b       OK\njavascript    ax5       ^a\\\\[b$             a[b       FAIL [eval]:1\njavascript    ax5       ^a]b$               a]b       OK\njavascript    ax5       ^a\\]b$              a]b       OK\njavascript    ax5       ^a\\\\]b$             a]b       FAIL a]b\njavascript    ax5       ^a{b$               a{b       OK\njavascript    ax5       ^a\\{b$              a{b       OK\njavascript    ax5       ^a\\\\{b$             a{b       FAIL a{b\njavascript    ax5       ^a}b$               a}b       OK\njavascript    ax5       ^a\\}b$              a}b       OK\njavascript    ax5       ^a\\\\}b$             a}b       FAIL a}b\njavascript    ax5       ^a{5}b$             a{5}b     FAIL a{5}b\njavascript    ax5       ^a\\{5\\}b$           a{5}b     OK\njavascript    ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL a{5}b\njavascript    ax5       ^a(b$               a(b       FAIL [eval]:1\njavascript    ax5       ^a\\(b$              a(b       OK\njavascript    ax5       ^a\\\\(b$             a(b       FAIL [eval]:1\njavascript    ax5       ^a)b$               a)b       FAIL [eval]:1\njavascript    ax5       ^a\\)b$              a)b       OK\njavascript    ax5       ^a\\\\)b$             a)b       FAIL [eval]:1\njavascript    ax5       ^(a|b)$             (a|b)     FAIL (a|b)\njavascript    ax5       ^\\(a\\|b\\)$          (a|b)     OK\njavascript    ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL (a|b)\njavascript    ax5       ^a+b$               a+b       FAIL a+b\njavascript    ax5       ^a\\+b$              a+b       OK\njavascript    ax5       ^a\\\\+b$             a+b       FAIL a+b\njavascript    ax5       ^a?b$               a?b       FAIL a?b\njavascript    ax5       ^a\\?b$              a?b       OK\njavascript    ax5       ^a\\\\?b$             a?b       FAIL a?b\njavascript    ax5       ^a^b$               a^b       FAIL a^b\njavascript    ax5       ^a\\^b$              a^b       OK\njavascript    ax5       ^a\\\\^b$             a^b       FAIL a^b\njavascript    ax5       ^a$b$               a$b       FAIL a$b\njavascript    ax5       ^a\\$b$              a$b       OK\njavascript    ax5       ^a\\\\$b$             a$b       FAIL a$b\njavascript    ax6       ^a[\\]_$             a\\_       FAIL [eval]:1\njavascript    ax6       ^a[\\\\]_$            a\\_       OK\njavascript    ax6       ^a[\\\\\\\\]_$          a\\_       OK\njavascript    ax7       ^a[[:alpha:]]$      ab        FAIL ab\njavascript    ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\nlex version: flex 2.6.4\nlex           -         ^a.$                ab        OK\nlex           -         ^[a]b$              ab        OK\nlex           -         ^[^b]b$             ab        OK\nlex           S2        ^abx?$              ab        OK\nlex           S2        ^abx\\?$             ab        FAIL\nlex           S2        ^abx\\\\?$            ab        FAIL\nlex           S2        ^abx*$              ab        OK\nlex           S2        ^abx\\*$             ab        FAIL\nlex           S2        ^abx\\\\*$            ab        FAIL\nlex           S2        ^ab+$               abb       OK\nlex           S2        ^ab\\+$              abb       FAIL\nlex           S2        ^ab\\\\+$             abb       FAIL\nlex           S2        ^ab{1}$             ab        OK\nlex           S2        ^ab\\{1}$            ab        FAIL tmp.lex.1.l:6: unrecognized rule\nlex           S2        ^ab\\{1\\}$           ab        FAIL\nlex           S2        ^ab\\\\{1\\\\}$         ab        FAIL tmp.lex.1.l:6: bad character inside {}'s\nlex           S2        ^ab{1,}$            abb       OK\nlex           S2        ^ab\\{1,}$           abb       FAIL tmp.lex.1.l:6: unrecognized rule\nlex           S2        ^ab\\{1,\\}$          abb       FAIL\nlex           S2        ^ab\\\\{1,\\\\}$        abb       FAIL tmp.lex.1.l:6: bad character inside {}'s\nlex           S2        ^ab{1,2}$           abb       OK\nlex           S2        ^ab\\{1,2}$          abb       FAIL tmp.lex.1.l:6: unrecognized rule\nlex           S2        ^ab\\{1,2\\}$         abb       FAIL\nlex           S2        ^ab\\\\{1,2\\\\}$       abb       FAIL tmp.lex.1.l:6: bad character inside {}'s\nlex           ax123     ^a(b)$              ab        OK\nlex           ax123     ^a\\(b\\)$            ab        FAIL\nlex           ax123     ^a\\\\(b\\\\)$          ab        FAIL\nlex           ax123     ^(x|ab)$            ab        OK\nlex           ax123     ^\\(x\\|ab\\)$         ab        FAIL\nlex           ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL\nlex           ax5       ^a\\_$               a\\_       FAIL\nlex           ax5       ^a\\\\_$              a\\_       OK\nlex           ax5       ^a\\\\\\\\_$            a\\_       FAIL\nlex           ax5       ^a\\.b$              a.b       OK\nlex           ax5       ^a\\\\.b$             a.b       FAIL\nlex           ax5       ^a*b$               a*b       FAIL\nlex           ax5       ^a\\*b$              a*b       OK\nlex           ax5       ^a\\\\*b$             a*b       FAIL\nlex           ax5       ^a[b$               a[b       FAIL tmp.lex.1.l:6: bad character class\nlex           ax5       ^a\\[b$              a[b       OK\nlex           ax5       ^a\\\\[b$             a[b       FAIL tmp.lex.1.l:6: bad character class\nlex           ax5       ^a]b$               a]b       OK\nlex           ax5       ^a\\]b$              a]b       OK\nlex           ax5       ^a\\\\]b$             a]b       FAIL\nlex           ax5       ^a{b$               a{b       FAIL tmp.lex.1.l:6: unrecognized rule\nlex           ax5       ^a\\{b$              a{b       OK\nlex           ax5       ^a\\\\{b$             a{b       FAIL tmp.lex.1.l:6: unrecognized rule\nlex           ax5       ^a}b$               a}b       FAIL tmp.lex.1.l:6: unrecognized rule\nlex           ax5       ^a\\}b$              a}b       OK\nlex           ax5       ^a\\\\}b$             a}b       FAIL tmp.lex.1.l:6: unrecognized rule\nlex           ax5       ^a{5}b$             a{5}b     FAIL\nlex           ax5       ^a\\{5\\}b$           a{5}b     OK\nlex           ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL tmp.lex.1.l:6: bad character inside {}'s\nlex           ax5       ^a(b$               a(b       FAIL tmp.lex.1.l:6: unrecognized rule\nlex           ax5       ^a\\(b$              a(b       OK\nlex           ax5       ^a\\\\(b$             a(b       FAIL tmp.lex.1.l:6: unrecognized rule\nlex           ax5       ^a)b$               a)b       FAIL tmp.lex.1.l:6: unbalanced parenthesis\nlex           ax5       ^a\\)b$              a)b       OK\nlex           ax5       ^a\\\\)b$             a)b       FAIL tmp.lex.1.l:6: unbalanced parenthesis\nlex           ax5       ^(a|b)$             (a|b)     FAIL\nlex           ax5       ^\\(a\\|b\\)$          (a|b)     OK\nlex           ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL\nlex           ax5       ^a+b$               a+b       FAIL\nlex           ax5       ^a\\+b$              a+b       OK\nlex           ax5       ^a\\\\+b$             a+b       FAIL\nlex           ax5       ^a?b$               a?b       FAIL\nlex           ax5       ^a\\?b$              a?b       OK\nlex           ax5       ^a\\\\?b$             a?b       FAIL\nlex           ax5       ^a^b$               a^b       OK\nlex           ax5       ^a\\^b$              a^b       OK\nlex           ax5       ^a\\\\^b$             a^b       FAIL\nlex           ax5       ^a$b$               a$b       OK\nlex           ax5       ^a\\$b$              a$b       OK\nlex           ax5       ^a\\\\$b$             a$b       FAIL\nlex           ax6       ^a[\\]_$             a\\_       FAIL tmp.lex.1.l:6: bad character class\nlex           ax6       ^a[\\\\]_$            a\\_       OK\nlex           ax6       ^a[\\\\\\\\]_$          a\\_       OK\nlex           ax7       ^a[[:alpha:]]$      ab        OK\nlex           ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\nmawk version: mawk 1.3.3 Nov 1996\nmawk          -         ^a.$                ab        OK\nmawk          -         ^[a]b$              ab        OK\nmawk          -         ^[^b]b$             ab        OK\nmawk          S2        ^abx?$              ab        OK\nmawk          S2        ^abx\\?$             ab        FAIL ab\nmawk          S2        ^abx\\\\?$            ab        FAIL ab\nmawk          S2        ^abx*$              ab        OK\nmawk          S2        ^abx\\*$             ab        FAIL ab\nmawk          S2        ^abx\\\\*$            ab        FAIL ab\nmawk          S2        ^ab+$               abb       OK\nmawk          S2        ^ab\\+$              abb       FAIL abb\nmawk          S2        ^ab\\\\+$             abb       FAIL abb\nmawk          S2        ^ab{1}$             ab        FAIL ab\nmawk          S2        ^ab\\{1}$            ab        FAIL ab\nmawk          S2        ^ab\\{1\\}$           ab        FAIL ab\nmawk          S2        ^ab\\\\{1\\\\}$         ab        FAIL ab\nmawk          S2        ^ab{1,}$            abb       FAIL abb\nmawk          S2        ^ab\\{1,}$           abb       FAIL abb\nmawk          S2        ^ab\\{1,\\}$          abb       FAIL abb\nmawk          S2        ^ab\\\\{1,\\\\}$        abb       FAIL abb\nmawk          S2        ^ab{1,2}$           abb       FAIL abb\nmawk          S2        ^ab\\{1,2}$          abb       FAIL abb\nmawk          S2        ^ab\\{1,2\\}$         abb       FAIL abb\nmawk          S2        ^ab\\\\{1,2\\\\}$       abb       FAIL abb\nmawk          ax123     ^a(b)$              ab        OK\nmawk          ax123     ^a\\(b\\)$            ab        FAIL ab\nmawk          ax123     ^a\\\\(b\\\\)$          ab        FAIL ab\nmawk          ax123     ^(x|ab)$            ab        OK\nmawk          ax123     ^\\(x\\|ab\\)$         ab        FAIL ab\nmawk          ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL ab\nmawk          ax5       ^a\\_$               a\\_       FAIL a\\_\nmawk          ax5       ^a\\\\_$              a\\_       OK\nmawk          ax5       ^a\\\\\\\\_$            a\\_       FAIL a\\_\nmawk          ax5       ^a\\.b$              a.b       OK\nmawk          ax5       ^a\\\\.b$             a.b       FAIL a.b\nmawk          ax5       ^a*b$               a*b       FAIL a*b\nmawk          ax5       ^a\\*b$              a*b       OK\nmawk          ax5       ^a\\\\*b$             a*b       FAIL a*b\nmawk          ax5       ^a[b$               a[b       FAIL mawk: line 1: regular expression compile failed (bad class -- [], [^] or [)\nmawk          ax5       ^a\\[b$              a[b       OK\nmawk          ax5       ^a\\\\[b$             a[b       FAIL mawk: line 1: regular expression compile failed (bad class -- [], [^] or [)\nmawk          ax5       ^a]b$               a]b       OK\nmawk          ax5       ^a\\]b$              a]b       OK\nmawk          ax5       ^a\\\\]b$             a]b       FAIL a]b\nmawk          ax5       ^a{b$               a{b       OK\nmawk          ax5       ^a\\{b$              a{b       OK\nmawk          ax5       ^a\\\\{b$             a{b       FAIL a{b\nmawk          ax5       ^a}b$               a}b       OK\nmawk          ax5       ^a\\}b$              a}b       OK\nmawk          ax5       ^a\\\\}b$             a}b       FAIL a}b\nmawk          ax5       ^a{5}b$             a{5}b     OK\nmawk          ax5       ^a\\{5\\}b$           a{5}b     OK\nmawk          ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL a{5}b\nmawk          ax5       ^a(b$               a(b       FAIL mawk: line 1: regular expression compile failed (missing ')')\nmawk          ax5       ^a\\(b$              a(b       OK\nmawk          ax5       ^a\\\\(b$             a(b       FAIL mawk: line 1: regular expression compile failed (missing ')')\nmawk          ax5       ^a)b$               a)b       FAIL mawk: line 1: regular expression compile failed (missing '(')\nmawk          ax5       ^a\\)b$              a)b       OK\nmawk          ax5       ^a\\\\)b$             a)b       FAIL mawk: line 1: regular expression compile failed (missing '(')\nmawk          ax5       ^(a|b)$             (a|b)     FAIL (a|b)\nmawk          ax5       ^\\(a\\|b\\)$          (a|b)     OK\nmawk          ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL (a|b)\nmawk          ax5       ^a+b$               a+b       FAIL a+b\nmawk          ax5       ^a\\+b$              a+b       OK\nmawk          ax5       ^a\\\\+b$             a+b       FAIL a+b\nmawk          ax5       ^a?b$               a?b       FAIL a?b\nmawk          ax5       ^a\\?b$              a?b       OK\nmawk          ax5       ^a\\\\?b$             a?b       FAIL a?b\nmawk          ax5       ^a^b$               a^b       FAIL a^b\nmawk          ax5       ^a\\^b$              a^b       OK\nmawk          ax5       ^a\\\\^b$             a^b       FAIL a^b\nmawk          ax5       ^a$b$               a$b       FAIL a$b\nmawk          ax5       ^a\\$b$              a$b       OK\nmawk          ax5       ^a\\\\$b$             a$b       FAIL a$b\nmawk          ax6       ^a[\\]_$             a\\_       FAIL mawk: line 1: regular expression compile failed (bad class -- [], [^] or [)\nmawk          ax6       ^a[\\\\]_$            a\\_       OK\nmawk          ax6       ^a[\\\\\\\\]_$          a\\_       OK\nmawk          ax7       ^a[[:alpha:]]$      ab        FAIL ab\nmawk          ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\nmysql version: mysql  Ver 14.14 Distrib 5.7.29\nmysql         -         ^a.$                ab        OK\nmysql         -         ^[a]b$              ab        OK\nmysql         -         ^[^b]b$             ab        OK\nmysql         S2        ^abx?$              ab        OK\nmysql         S2        ^abx\\?$             ab        OK\nmysql         S2        ^abx\\\\?$            ab        FAIL 0\nmysql         S2        ^abx*$              ab        OK\nmysql         S2        ^abx\\*$             ab        OK\nmysql         S2        ^abx\\\\*$            ab        FAIL 0\nmysql         S2        ^ab+$               abb       OK\nmysql         S2        ^ab\\+$              abb       OK\nmysql         S2        ^ab\\\\+$             abb       FAIL 0\nmysql         S2        ^ab{1}$             ab        OK\nmysql         S2        ^ab\\{1}$            ab        OK\nmysql         S2        ^ab\\{1\\}$           ab        OK\nmysql         S2        ^ab\\\\{1\\\\}$         ab        FAIL 0\nmysql         S2        ^ab{1,}$            abb       OK\nmysql         S2        ^ab\\{1,}$           abb       OK\nmysql         S2        ^ab\\{1,\\}$          abb       OK\nmysql         S2        ^ab\\\\{1,\\\\}$        abb       FAIL 0\nmysql         S2        ^ab{1,2}$           abb       OK\nmysql         S2        ^ab\\{1,2}$          abb       OK\nmysql         S2        ^ab\\{1,2\\}$         abb       OK\nmysql         S2        ^ab\\\\{1,2\\\\}$       abb       FAIL 0\nmysql         ax123     ^a(b)$              ab        OK\nmysql         ax123     ^a\\(b\\)$            ab        OK\nmysql         ax123     ^a\\\\(b\\\\)$          ab        FAIL 0\nmysql         ax123     ^(x|ab)$            ab        OK\nmysql         ax123     ^\\(x\\|ab\\)$         ab        OK\nmysql         ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL 0\nmysql         ax5       ^a\\_$               a\\_       FAIL 0\nmysql         ax5       ^a\\\\_$              a\\_       FAIL 0\nmysql         ax5       ^a\\\\\\\\_$            a\\_       OK\nmysql         ax5       ^a\\.b$              a.b       OK\nmysql         ax5       ^a\\\\.b$             a.b       OK\nmysql         ax5       ^a*b$               a*b       FAIL 0\nmysql         ax5       ^a\\*b$              a*b       FAIL 0\nmysql         ax5       ^a\\\\*b$             a*b       OK\nmysql         ax5       ^a[b$               a[b       FAIL ERROR 1139 (42000) at line 1: Got error 'brackets ([ ]) not balanced' from regexp\nmysql         ax5       ^a\\[b$              a[b       FAIL ERROR 1139 (42000) at line 1: Got error 'brackets ([ ]) not balanced' from regexp\nmysql         ax5       ^a\\\\[b$             a[b       OK\nmysql         ax5       ^a]b$               a]b       OK\nmysql         ax5       ^a\\]b$              a]b       OK\nmysql         ax5       ^a\\\\]b$             a]b       OK\nmysql         ax5       ^a{b$               a{b       OK\nmysql         ax5       ^a\\{b$              a{b       OK\nmysql         ax5       ^a\\\\{b$             a{b       OK\nmysql         ax5       ^a}b$               a}b       OK\nmysql         ax5       ^a\\}b$              a}b       OK\nmysql         ax5       ^a\\\\}b$             a}b       OK\nmysql         ax5       ^a{5}b$             a{5}b     FAIL 0\nmysql         ax5       ^a\\{5\\}b$           a{5}b     FAIL 0\nmysql         ax5       ^a\\\\{5\\\\}b$         a{5}b     OK\nmysql         ax5       ^a(b$               a(b       FAIL ERROR 1139 (42000) at line 1: Got error 'parentheses not balanced' from regexp\nmysql         ax5       ^a\\(b$              a(b       FAIL ERROR 1139 (42000) at line 1: Got error 'parentheses not balanced' from regexp\nmysql         ax5       ^a\\\\(b$             a(b       OK\nmysql         ax5       ^a)b$               a)b       OK\nmysql         ax5       ^a\\)b$              a)b       OK\nmysql         ax5       ^a\\\\)b$             a)b       OK\nmysql         ax5       ^(a|b)$             (a|b)     FAIL 0\nmysql         ax5       ^\\(a\\|b\\)$          (a|b)     FAIL 0\nmysql         ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     OK\nmysql         ax5       ^a+b$               a+b       FAIL 0\nmysql         ax5       ^a\\+b$              a+b       FAIL 0\nmysql         ax5       ^a\\\\+b$             a+b       OK\nmysql         ax5       ^a?b$               a?b       FAIL 0\nmysql         ax5       ^a\\?b$              a?b       FAIL 0\nmysql         ax5       ^a\\\\?b$             a?b       OK\nmysql         ax5       ^a^b$               a^b       FAIL 0\nmysql         ax5       ^a\\^b$              a^b       FAIL 0\nmysql         ax5       ^a\\\\^b$             a^b       OK\nmysql         ax5       ^a$b$               a$b       FAIL 0\nmysql         ax5       ^a\\$b$              a$b       FAIL 0\nmysql         ax5       ^a\\\\$b$             a$b       OK\nmysql         ax6       ^a[\\]_$             a\\_       FAIL ERROR 1139 (42000) at line 1: Got error 'brackets ([ ]) not balanced' from regexp\nmysql         ax6       ^a[\\\\]_$            a\\_       OK\nmysql         ax6       ^a[\\\\\\\\]_$          a\\_       OK\nmysql         ax7       ^a[[:alpha:]]$      ab        OK\nmysql         ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\nperl version: perl v5.26.1\nperl          -         ^a.$                ab        OK\nperl          -         ^[a]b$              ab        OK\nperl          -         ^[^b]b$             ab        OK\nperl          S2        ^abx?$              ab        OK\nperl          S2        ^abx\\?$             ab        FAIL ab\nperl          S2        ^abx\\\\?$            ab        FAIL ab\nperl          S2        ^abx*$              ab        OK\nperl          S2        ^abx\\*$             ab        FAIL ab\nperl          S2        ^abx\\\\*$            ab        FAIL ab\nperl          S2        ^ab+$               abb       OK\nperl          S2        ^ab\\+$              abb       FAIL abb\nperl          S2        ^ab\\\\+$             abb       FAIL abb\nperl          S2        ^ab{1}$             ab        OK\nperl          S2        ^ab\\{1}$            ab        FAIL ab\nperl          S2        ^ab\\{1\\}$           ab        FAIL ab\nperl          S2        ^ab\\\\{1\\\\}$         ab        FAIL Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/^ab\\\\{ <-- HERE 1\\\\}$/ at -e line 1.\nperl          S2        ^ab{1,}$            abb       OK\nperl          S2        ^ab\\{1,}$           abb       FAIL abb\nperl          S2        ^ab\\{1,\\}$          abb       FAIL abb\nperl          S2        ^ab\\\\{1,\\\\}$        abb       FAIL Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/^ab\\\\{ <-- HERE 1,\\\\}$/ at -e line 1.\nperl          S2        ^ab{1,2}$           abb       OK\nperl          S2        ^ab\\{1,2}$          abb       FAIL abb\nperl          S2        ^ab\\{1,2\\}$         abb       FAIL abb\nperl          S2        ^ab\\\\{1,2\\\\}$       abb       FAIL Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/^ab\\\\{ <-- HERE 1,2\\\\}$/ at -e line 1.\nperl          ax123     ^a(b)$              ab        OK\nperl          ax123     ^a\\(b\\)$            ab        FAIL ab\nperl          ax123     ^a\\\\(b\\\\)$          ab        FAIL ab\nperl          ax123     ^(x|ab)$            ab        OK\nperl          ax123     ^\\(x\\|ab\\)$         ab        FAIL ab\nperl          ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL ab\nperl          ax5       ^a\\_$               a\\_       FAIL a\\_\nperl          ax5       ^a\\\\_$              a\\_       OK\nperl          ax5       ^a\\\\\\\\_$            a\\_       FAIL a\\_\nperl          ax5       ^a\\.b$              a.b       OK\nperl          ax5       ^a\\\\.b$             a.b       FAIL a.b\nperl          ax5       ^a*b$               a*b       FAIL a*b\nperl          ax5       ^a\\*b$              a*b       OK\nperl          ax5       ^a\\\\*b$             a*b       FAIL a*b\nperl          ax5       ^a[b$               a[b       FAIL Unmatched [ in regex; marked by <-- HERE in m/^a[ <-- HERE b$/ at -e line 1.\nperl          ax5       ^a\\[b$              a[b       OK\nperl          ax5       ^a\\\\[b$             a[b       FAIL Unmatched [ in regex; marked by <-- HERE in m/^a\\\\[ <-- HERE b$/ at -e line 1.\nperl          ax5       ^a]b$               a]b       OK\nperl          ax5       ^a\\]b$              a]b       OK\nperl          ax5       ^a\\\\]b$             a]b       FAIL a]b\nperl          ax5       ^a{b$               a{b       FAIL Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/^a{ <-- HERE b$/ at -e line 1.\nperl          ax5       ^a\\{b$              a{b       OK\nperl          ax5       ^a\\\\{b$             a{b       FAIL Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/^a\\\\{ <-- HERE b$/ at -e line 1.\nperl          ax5       ^a}b$               a}b       OK\nperl          ax5       ^a\\}b$              a}b       OK\nperl          ax5       ^a\\\\}b$             a}b       FAIL a}b\nperl          ax5       ^a{5}b$             a{5}b     FAIL a{5}b\nperl          ax5       ^a\\{5\\}b$           a{5}b     OK\nperl          ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/^a\\\\{ <-- HERE 5\\\\}b$/ at -e line 1.\nperl          ax5       ^a(b$               a(b       FAIL Unmatched ( in regex; marked by <-- HERE in m/^a( <-- HERE b$/ at -e line 1.\nperl          ax5       ^a\\(b$              a(b       OK\nperl          ax5       ^a\\\\(b$             a(b       FAIL Unmatched ( in regex; marked by <-- HERE in m/^a\\\\( <-- HERE b$/ at -e line 1.\nperl          ax5       ^a)b$               a)b       FAIL Unmatched ) in regex; marked by <-- HERE in m/^a) <-- HERE b$/ at -e line 1.\nperl          ax5       ^a\\)b$              a)b       OK\nperl          ax5       ^a\\\\)b$             a)b       FAIL Unmatched ) in regex; marked by <-- HERE in m/^a\\\\) <-- HERE b$/ at -e line 1.\nperl          ax5       ^(a|b)$             (a|b)     FAIL (a|b)\nperl          ax5       ^\\(a\\|b\\)$          (a|b)     OK\nperl          ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL (a|b)\nperl          ax5       ^a+b$               a+b       FAIL a+b\nperl          ax5       ^a\\+b$              a+b       OK\nperl          ax5       ^a\\\\+b$             a+b       FAIL a+b\nperl          ax5       ^a?b$               a?b       FAIL a?b\nperl          ax5       ^a\\?b$              a?b       OK\nperl          ax5       ^a\\\\?b$             a?b       FAIL a?b\nperl          ax5       ^a^b$               a^b       FAIL a^b\nperl          ax5       ^a\\^b$              a^b       OK\nperl          ax5       ^a\\\\^b$             a^b       FAIL a^b\nperl          ax5       ^a$b$               a$b       FAIL a$b\nperl          ax5       ^a\\$b$              a$b       OK\nperl          ax5       ^a\\\\$b$             a$b       FAIL a$b\nperl          ax6       ^a[\\]_$             a\\_       FAIL Unmatched [ in regex; marked by <-- HERE in m/^a[ <-- HERE \\]_$/ at -e line 1.\nperl          ax6       ^a[\\\\]_$            a\\_       OK\nperl          ax6       ^a[\\\\\\\\]_$          a\\_       OK\nperl          ax7       ^a[[:alpha:]]$      ab        OK\nperl          ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\nphp version: PHP 7.2.24-0ubuntu0.18.04.4\nphp           -         ^a.$                ab        OK\nphp           -         ^[a]b$              ab        OK\nphp           -         ^[^b]b$             ab        OK\nphp           S2        ^abx?$              ab        OK\nphp           S2        ^abx\\?$             ab        FAIL ab\nphp           S2        ^abx\\\\?$            ab        FAIL ab\nphp           S2        ^abx*$              ab        OK\nphp           S2        ^abx\\*$             ab        FAIL ab\nphp           S2        ^abx\\\\*$            ab        FAIL ab\nphp           S2        ^ab+$               abb       OK\nphp           S2        ^ab\\+$              abb       FAIL abb\nphp           S2        ^ab\\\\+$             abb       FAIL abb\nphp           S2        ^ab{1}$             ab        OK\nphp           S2        ^ab\\{1}$            ab        FAIL ab\nphp           S2        ^ab\\{1\\}$           ab        FAIL ab\nphp           S2        ^ab\\\\{1\\\\}$         ab        FAIL ab\nphp           S2        ^ab{1,}$            abb       OK\nphp           S2        ^ab\\{1,}$           abb       FAIL abb\nphp           S2        ^ab\\{1,\\}$          abb       FAIL abb\nphp           S2        ^ab\\\\{1,\\\\}$        abb       FAIL abb\nphp           S2        ^ab{1,2}$           abb       OK\nphp           S2        ^ab\\{1,2}$          abb       FAIL abb\nphp           S2        ^ab\\{1,2\\}$         abb       FAIL abb\nphp           S2        ^ab\\\\{1,2\\\\}$       abb       FAIL abb\nphp           ax123     ^a(b)$              ab        OK\nphp           ax123     ^a\\(b\\)$            ab        FAIL ab\nphp           ax123     ^a\\\\(b\\\\)$          ab        FAIL ab\nphp           ax123     ^(x|ab)$            ab        OK\nphp           ax123     ^\\(x\\|ab\\)$         ab        FAIL ab\nphp           ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL ab\nphp           ax5       ^a\\_$               a\\_       FAIL a\\_\nphp           ax5       ^a\\\\_$              a\\_       FAIL a\\_\nphp           ax5       ^a\\\\\\\\_$            a\\_       OK\nphp           ax5       ^a\\.b$              a.b       OK\nphp           ax5       ^a\\\\.b$             a.b       OK\nphp           ax5       ^a*b$               a*b       FAIL a*b\nphp           ax5       ^a\\*b$              a*b       OK\nphp           ax5       ^a\\\\*b$             a*b       OK\nphp           ax5       ^a[b$               a[b       FAIL PHP Warning:  preg_replace(): Compilation failed: missing terminating ] for character class at offset 5 in Standard input code on line 1\nphp           ax5       ^a\\[b$              a[b       OK\nphp           ax5       ^a\\\\[b$             a[b       OK\nphp           ax5       ^a]b$               a]b       OK\nphp           ax5       ^a\\]b$              a]b       OK\nphp           ax5       ^a\\\\]b$             a]b       OK\nphp           ax5       ^a{b$               a{b       OK\nphp           ax5       ^a\\{b$              a{b       OK\nphp           ax5       ^a\\\\{b$             a{b       OK\nphp           ax5       ^a}b$               a}b       OK\nphp           ax5       ^a\\}b$              a}b       OK\nphp           ax5       ^a\\\\}b$             a}b       OK\nphp           ax5       ^a{5}b$             a{5}b     FAIL a{5}b\nphp           ax5       ^a\\{5\\}b$           a{5}b     OK\nphp           ax5       ^a\\\\{5\\\\}b$         a{5}b     OK\nphp           ax5       ^a(b$               a(b       FAIL PHP Warning:  preg_replace(): Compilation failed: missing ) at offset 5 in Standard input code on line 1\nphp           ax5       ^a\\(b$              a(b       OK\nphp           ax5       ^a\\\\(b$             a(b       OK\nphp           ax5       ^a)b$               a)b       FAIL PHP Warning:  preg_replace(): Compilation failed: unmatched parentheses at offset 2 in Standard input code on line 1\nphp           ax5       ^a\\)b$              a)b       OK\nphp           ax5       ^a\\\\)b$             a)b       OK\nphp           ax5       ^(a|b)$             (a|b)     FAIL (a|b)\nphp           ax5       ^\\(a\\|b\\)$          (a|b)     OK\nphp           ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     OK\nphp           ax5       ^a+b$               a+b       FAIL a+b\nphp           ax5       ^a\\+b$              a+b       OK\nphp           ax5       ^a\\\\+b$             a+b       OK\nphp           ax5       ^a?b$               a?b       FAIL a?b\nphp           ax5       ^a\\?b$              a?b       OK\nphp           ax5       ^a\\\\?b$             a?b       OK\nphp           ax5       ^a^b$               a^b       FAIL a^b\nphp           ax5       ^a\\^b$              a^b       OK\nphp           ax5       ^a\\\\^b$             a^b       OK\nphp           ax5       ^a$b$               a$b       FAIL a$b\nphp           ax5       ^a\\$b$              a$b       OK\nphp           ax5       ^a\\\\$b$             a$b       OK\nphp           ax6       ^a[\\]_$             a\\_       FAIL PHP Warning:  preg_replace(): Compilation failed: missing terminating ] for character class at offset 7 in Standard input code on line 1\nphp           ax6       ^a[\\\\]_$            a\\_       FAIL PHP Warning:  preg_replace(): Compilation failed: missing terminating ] for character class at offset 7 in Standard input code on line 1\nphp           ax6       ^a[\\\\\\\\]_$          a\\_       OK\nphp           ax7       ^a[[:alpha:]]$      ab        OK\nphp           ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\npostgres version: psql (PostgreSQL) 10.12\npostgres      -         ^a.$                ab        OK\npostgres      -         ^[a]b$              ab        OK\npostgres      -         ^[^b]b$             ab        OK\npostgres      S2        ^abx?$              ab        OK\npostgres      S2        ^abx\\?$             ab        FAIL ab\npostgres      S2        ^abx\\\\?$            ab        FAIL ab\npostgres      S2        ^abx*$              ab        OK\npostgres      S2        ^abx\\*$             ab        FAIL ab\npostgres      S2        ^abx\\\\*$            ab        FAIL ab\npostgres      S2        ^ab+$               abb       OK\npostgres      S2        ^ab\\+$              abb       FAIL abb\npostgres      S2        ^ab\\\\+$             abb       FAIL abb\npostgres      S2        ^ab{1}$             ab        OK\npostgres      S2        ^ab\\{1}$            ab        FAIL ab\npostgres      S2        ^ab\\{1\\}$           ab        FAIL ab\npostgres      S2        ^ab\\\\{1\\\\}$         ab        FAIL ERROR:  invalid regular expression: invalid repetition count(s)\npostgres      S2        ^ab{1,}$            abb       OK\npostgres      S2        ^ab\\{1,}$           abb       FAIL abb\npostgres      S2        ^ab\\{1,\\}$          abb       FAIL abb\npostgres      S2        ^ab\\\\{1,\\\\}$        abb       FAIL ERROR:  invalid regular expression: invalid repetition count(s)\npostgres      S2        ^ab{1,2}$           abb       OK\npostgres      S2        ^ab\\{1,2}$          abb       FAIL abb\npostgres      S2        ^ab\\{1,2\\}$         abb       FAIL abb\npostgres      S2        ^ab\\\\{1,2\\\\}$       abb       FAIL ERROR:  invalid regular expression: invalid repetition count(s)\npostgres      ax123     ^a(b)$              ab        OK\npostgres      ax123     ^a\\(b\\)$            ab        FAIL ab\npostgres      ax123     ^a\\\\(b\\\\)$          ab        FAIL ab\npostgres      ax123     ^(x|ab)$            ab        OK\npostgres      ax123     ^\\(x\\|ab\\)$         ab        FAIL ab\npostgres      ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL ab\npostgres      ax5       ^a\\_$               a\\_       FAIL a\\_\npostgres      ax5       ^a\\\\_$              a\\_       OK\npostgres      ax5       ^a\\\\\\\\_$            a\\_       FAIL a\\_\npostgres      ax5       ^a\\.b$              a.b       OK\npostgres      ax5       ^a\\\\.b$             a.b       FAIL a.b\npostgres      ax5       ^a*b$               a*b       FAIL a*b\npostgres      ax5       ^a\\*b$              a*b       OK\npostgres      ax5       ^a\\\\*b$             a*b       FAIL a*b\npostgres      ax5       ^a[b$               a[b       FAIL ERROR:  invalid regular expression: brackets [] not balanced\npostgres      ax5       ^a\\[b$              a[b       OK\npostgres      ax5       ^a\\\\[b$             a[b       FAIL ERROR:  invalid regular expression: brackets [] not balanced\npostgres      ax5       ^a]b$               a]b       OK\npostgres      ax5       ^a\\]b$              a]b       OK\npostgres      ax5       ^a\\\\]b$             a]b       FAIL a]b\npostgres      ax5       ^a{b$               a{b       OK\npostgres      ax5       ^a\\{b$              a{b       OK\npostgres      ax5       ^a\\\\{b$             a{b       FAIL a{b\npostgres      ax5       ^a}b$               a}b       OK\npostgres      ax5       ^a\\}b$              a}b       OK\npostgres      ax5       ^a\\\\}b$             a}b       FAIL a}b\npostgres      ax5       ^a{5}b$             a{5}b     FAIL a{5}b\npostgres      ax5       ^a\\{5\\}b$           a{5}b     OK\npostgres      ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL ERROR:  invalid regular expression: invalid repetition count(s)\npostgres      ax5       ^a(b$               a(b       FAIL ERROR:  invalid regular expression: parentheses () not balanced\npostgres      ax5       ^a\\(b$              a(b       OK\npostgres      ax5       ^a\\\\(b$             a(b       FAIL ERROR:  invalid regular expression: parentheses () not balanced\npostgres      ax5       ^a)b$               a)b       FAIL ERROR:  invalid regular expression: parentheses () not balanced\npostgres      ax5       ^a\\)b$              a)b       OK\npostgres      ax5       ^a\\\\)b$             a)b       FAIL ERROR:  invalid regular expression: parentheses () not balanced\npostgres      ax5       ^(a|b)$             (a|b)     FAIL (a|b)\npostgres      ax5       ^\\(a\\|b\\)$          (a|b)     OK\npostgres      ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL (a|b)\npostgres      ax5       ^a+b$               a+b       FAIL a+b\npostgres      ax5       ^a\\+b$              a+b       OK\npostgres      ax5       ^a\\\\+b$             a+b       FAIL a+b\npostgres      ax5       ^a?b$               a?b       FAIL a?b\npostgres      ax5       ^a\\?b$              a?b       OK\npostgres      ax5       ^a\\\\?b$             a?b       FAIL a?b\npostgres      ax5       ^a^b$               a^b       FAIL a^b\npostgres      ax5       ^a\\^b$              a^b       OK\npostgres      ax5       ^a\\\\^b$             a^b       FAIL a^b\npostgres      ax5       ^a$b$               a$b       FAIL a$b\npostgres      ax5       ^a\\$b$              a$b       OK\npostgres      ax5       ^a\\\\$b$             a$b       FAIL a$b\npostgres      ax6       ^a[\\]_$             a\\_       FAIL ERROR:  invalid regular expression: brackets [] not balanced\npostgres      ax6       ^a[\\\\]_$            a\\_       OK\npostgres      ax6       ^a[\\\\\\\\]_$          a\\_       OK\npostgres      ax7       ^a[[:alpha:]]$      ab        OK\npostgres      ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\nprocmail version: procmail v3.23pre 2001/09/13\nprocmail      -         ^a.$                ab        OK\nprocmail      -         ^[a]b$              ab        OK\nprocmail      -         ^[^b]b$             ab        OK\nprocmail      S2        ^abx?$              ab        OK\nprocmail      S2        ^abx\\?$             ab        FAIL No match on \"^abx\\?$\"\nprocmail      S2        ^abx\\\\?$            ab        FAIL No match on \"^abx\\\\?$\"\nprocmail      S2        ^abx*$              ab        OK\nprocmail      S2        ^abx\\*$             ab        FAIL No match on \"^abx\\*$\"\nprocmail      S2        ^abx\\\\*$            ab        FAIL No match on \"^abx\\\\*$\"\nprocmail      S2        ^ab+$               abb       OK\nprocmail      S2        ^ab\\+$              abb       FAIL No match on \"^ab\\+$\"\nprocmail      S2        ^ab\\\\+$             abb       FAIL No match on \"^ab\\\\+$\"\nprocmail      S2        ^ab{1}$             ab        FAIL No match on \"^ab{1}$\"\nprocmail      S2        ^ab\\{1}$            ab        FAIL No match on \"^ab\\{1}$\"\nprocmail      S2        ^ab\\{1\\}$           ab        FAIL No match on \"^ab\\{1\\}$\"\nprocmail      S2        ^ab\\\\{1\\\\}$         ab        FAIL No match on \"^ab\\\\{1\\\\}$\"\nprocmail      S2        ^ab{1,}$            abb       FAIL No match on \"^ab{1,}$\"\nprocmail      S2        ^ab\\{1,}$           abb       FAIL No match on \"^ab\\{1,}$\"\nprocmail      S2        ^ab\\{1,\\}$          abb       FAIL No match on \"^ab\\{1,\\}$\"\nprocmail      S2        ^ab\\\\{1,\\\\}$        abb       FAIL No match on \"^ab\\\\{1,\\\\}$\"\nprocmail      S2        ^ab{1,2}$           abb       FAIL No match on \"^ab{1,2}$\"\nprocmail      S2        ^ab\\{1,2}$          abb       FAIL No match on \"^ab\\{1,2}$\"\nprocmail      S2        ^ab\\{1,2\\}$         abb       FAIL No match on \"^ab\\{1,2\\}$\"\nprocmail      S2        ^ab\\\\{1,2\\\\}$       abb       FAIL No match on \"^ab\\\\{1,2\\\\}$\"\nprocmail      ax123     ^a(b)$              ab        OK\nprocmail      ax123     ^a\\(b\\)$            ab        FAIL No match on \"^a\\(b\\)$\"\nprocmail      ax123     ^a\\\\(b\\\\)$          ab        FAIL No match on \"^a\\\\(b\\\\)$\"\nprocmail      ax123     ^(x|ab)$            ab        OK\nprocmail      ax123     ^\\(x\\|ab\\)$         ab        FAIL No match on \"^\\(x\\|ab\\)$\"\nprocmail      ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL No match on \"^\\\\(x\\\\|ab\\\\)$\"\nprocmail      ax5       ^a\\_$               a\\_       FAIL No match on \"^a\\_$\"\nprocmail      ax5       ^a\\\\_$              a\\_       OK\nprocmail      ax5       ^a\\\\\\\\_$            a\\_       FAIL No match on \"^a\\\\\\\\_$\"\nprocmail      ax5       ^a\\.b$              a.b       OK\nprocmail      ax5       ^a\\\\.b$             a.b       FAIL No match on \"^a\\\\.b$\"\nprocmail      ax5       ^a*b$               a*b       FAIL No match on \"^a*b$\"\nprocmail      ax5       ^a\\*b$              a*b       OK\nprocmail      ax5       ^a\\\\*b$             a*b       FAIL No match on \"^a\\\\*b$\"\nprocmail      ax5       ^a[b$               a[b       FAIL No match on \"^a[b$\"\nprocmail      ax5       ^a\\[b$              a[b       OK\nprocmail      ax5       ^a\\\\[b$             a[b       FAIL No match on \"^a\\\\[b$\"\nprocmail      ax5       ^a]b$               a]b       OK\nprocmail      ax5       ^a\\]b$              a]b       OK\nprocmail      ax5       ^a\\\\]b$             a]b       FAIL No match on \"^a\\\\]b$\"\nprocmail      ax5       ^a{b$               a{b       OK\nprocmail      ax5       ^a\\{b$              a{b       OK\nprocmail      ax5       ^a\\\\{b$             a{b       FAIL No match on \"^a\\\\{b$\"\nprocmail      ax5       ^a}b$               a}b       OK\nprocmail      ax5       ^a\\}b$              a}b       OK\nprocmail      ax5       ^a\\\\}b$             a}b       FAIL No match on \"^a\\\\}b$\"\nprocmail      ax5       ^a{5}b$             a{5}b     OK\nprocmail      ax5       ^a\\{5\\}b$           a{5}b     OK\nprocmail      ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL No match on \"^a\\\\{5\\\\}b$\"\nprocmail      ax5       ^a(b$               a(b       FAIL Invalid regexp \"^a(b$\"\nprocmail      ax5       ^a\\(b$              a(b       OK\nprocmail      ax5       ^a\\\\(b$             a(b       FAIL Invalid regexp \"^a\\\\(b$\"\nprocmail      ax5       ^a)b$               a)b       FAIL Invalid regexp \"^a)b$\"\nprocmail      ax5       ^a\\)b$              a)b       OK\nprocmail      ax5       ^a\\\\)b$             a)b       FAIL Invalid regexp \"^a\\\\)b$\"\nprocmail      ax5       ^(a|b)$             (a|b)     FAIL No match on \"^(a|b)$\"\nprocmail      ax5       ^\\(a\\|b\\)$          (a|b)     OK\nprocmail      ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL No match on \"^\\\\(a\\\\|b\\\\)$\"\nprocmail      ax5       ^a+b$               a+b       FAIL No match on \"^a+b$\"\nprocmail      ax5       ^a\\+b$              a+b       OK\nprocmail      ax5       ^a\\\\+b$             a+b       FAIL No match on \"^a\\\\+b$\"\nprocmail      ax5       ^a?b$               a?b       FAIL No match on \"^a?b$\"\nprocmail      ax5       ^a\\?b$              a?b       OK\nprocmail      ax5       ^a\\\\?b$             a?b       FAIL No match on \"^a\\\\?b$\"\nprocmail      ax5       ^a^b$               a^b       FAIL No match on \"^a^b$\"\nprocmail      ax5       ^a\\^b$              a^b       OK\nprocmail      ax5       ^a\\\\^b$             a^b       FAIL No match on \"^a\\\\^b$\"\nprocmail      ax5       ^a$b$               a$b       FAIL No match on \"^a$b$\"\nprocmail      ax5       ^a\\$b$              a$b       OK\nprocmail      ax5       ^a\\\\$b$             a$b       FAIL No match on \"^a\\\\$b$\"\nprocmail      ax6       ^a[\\]_$             a\\_       OK\nprocmail      ax6       ^a[\\\\]_$            a\\_       OK\nprocmail      ax6       ^a[\\\\\\\\]_$          a\\_       OK\nprocmail      ax7       ^a[[:alpha:]]$      ab        FAIL No match on \"^a[[:alpha:]]$\"\nprocmail      ax8       ^a[\\t]b$            a<tab>b   FAIL No match on \"^a[\\t]b$\"\n----------------------------------------------------------\npython version: Python 3.6.9\npython        -         ^a.$                ab        OK\npython        -         ^[a]b$              ab        OK\npython        -         ^[^b]b$             ab        OK\npython        S2        ^abx?$              ab        OK\npython        S2        ^abx\\?$             ab        FAIL ab\npython        S2        ^abx\\\\?$            ab        FAIL ab\npython        S2        ^abx*$              ab        OK\npython        S2        ^abx\\*$             ab        FAIL ab\npython        S2        ^abx\\\\*$            ab        FAIL ab\npython        S2        ^ab+$               abb       OK\npython        S2        ^ab\\+$              abb       FAIL abb\npython        S2        ^ab\\\\+$             abb       FAIL abb\npython        S2        ^ab{1}$             ab        OK\npython        S2        ^ab\\{1}$            ab        FAIL ab\npython        S2        ^ab\\{1\\}$           ab        FAIL ab\npython        S2        ^ab\\\\{1\\\\}$         ab        FAIL ab\npython        S2        ^ab{1,}$            abb       OK\npython        S2        ^ab\\{1,}$           abb       FAIL abb\npython        S2        ^ab\\{1,\\}$          abb       FAIL abb\npython        S2        ^ab\\\\{1,\\\\}$        abb       FAIL abb\npython        S2        ^ab{1,2}$           abb       OK\npython        S2        ^ab\\{1,2}$          abb       FAIL abb\npython        S2        ^ab\\{1,2\\}$         abb       FAIL abb\npython        S2        ^ab\\\\{1,2\\\\}$       abb       FAIL abb\npython        ax123     ^a(b)$              ab        OK\npython        ax123     ^a\\(b\\)$            ab        FAIL ab\npython        ax123     ^a\\\\(b\\\\)$          ab        FAIL ab\npython        ax123     ^(x|ab)$            ab        OK\npython        ax123     ^\\(x\\|ab\\)$         ab        FAIL ab\npython        ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL ab\npython        ax5       ^a\\_$               a\\_       FAIL a\\_\npython        ax5       ^a\\\\_$              a\\_       OK\npython        ax5       ^a\\\\\\\\_$            a\\_       FAIL a\\_\npython        ax5       ^a\\.b$              a.b       OK\npython        ax5       ^a\\\\.b$             a.b       FAIL a.b\npython        ax5       ^a*b$               a*b       FAIL a*b\npython        ax5       ^a\\*b$              a*b       OK\npython        ax5       ^a\\\\*b$             a*b       FAIL a*b\npython        ax5       ^a[b$               a[b       FAIL unterminated character set at position 2\npython        ax5       ^a\\[b$              a[b       OK\npython        ax5       ^a\\\\[b$             a[b       FAIL unterminated character set at position 4\npython        ax5       ^a]b$               a]b       OK\npython        ax5       ^a\\]b$              a]b       OK\npython        ax5       ^a\\\\]b$             a]b       FAIL a]b\npython        ax5       ^a{b$               a{b       OK\npython        ax5       ^a\\{b$              a{b       OK\npython        ax5       ^a\\\\{b$             a{b       FAIL a{b\npython        ax5       ^a}b$               a}b       OK\npython        ax5       ^a\\}b$              a}b       OK\npython        ax5       ^a\\\\}b$             a}b       FAIL a}b\npython        ax5       ^a{5}b$             a{5}b     FAIL a{5}b\npython        ax5       ^a\\{5\\}b$           a{5}b     OK\npython        ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL a{5}b\npython        ax5       ^a(b$               a(b       FAIL missing ), unterminated subpattern at position 2\npython        ax5       ^a\\(b$              a(b       OK\npython        ax5       ^a\\\\(b$             a(b       FAIL missing ), unterminated subpattern at position 4\npython        ax5       ^a)b$               a)b       FAIL unbalanced parenthesis at position 2\npython        ax5       ^a\\)b$              a)b       OK\npython        ax5       ^a\\\\)b$             a)b       FAIL unbalanced parenthesis at position 4\npython        ax5       ^(a|b)$             (a|b)     FAIL (a|b)\npython        ax5       ^\\(a\\|b\\)$          (a|b)     OK\npython        ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL (a|b)\npython        ax5       ^a+b$               a+b       FAIL a+b\npython        ax5       ^a\\+b$              a+b       OK\npython        ax5       ^a\\\\+b$             a+b       FAIL a+b\npython        ax5       ^a?b$               a?b       FAIL a?b\npython        ax5       ^a\\?b$              a?b       OK\npython        ax5       ^a\\\\?b$             a?b       FAIL a?b\npython        ax5       ^a^b$               a^b       FAIL a^b\npython        ax5       ^a\\^b$              a^b       OK\npython        ax5       ^a\\\\^b$             a^b       FAIL a^b\npython        ax5       ^a$b$               a$b       FAIL a$b\npython        ax5       ^a\\$b$              a$b       OK\npython        ax5       ^a\\\\$b$             a$b       FAIL a$b\npython        ax6       ^a[\\]_$             a\\_       FAIL unterminated character set at position 2\npython        ax6       ^a[\\\\]_$            a\\_       OK\npython        ax6       ^a[\\\\\\\\]_$          a\\_       OK\npython        ax7       ^a[[:alpha:]]$      ab        FAIL ab\npython        ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\nsed version: sed (GNU sed) 4.4\nsed           -         ^a.$                ab        OK\nsed           -         ^[a]b$              ab        OK\nsed           -         ^[^b]b$             ab        OK\nsed           S2        ^abx?$              ab        FAIL ab\nsed           S2        ^abx\\?$             ab        OK\nsed           S2        ^abx\\\\?$            ab        FAIL ab\nsed           S2        ^abx*$              ab        OK\nsed           S2        ^abx\\*$             ab        FAIL ab\nsed           S2        ^abx\\\\*$            ab        FAIL ab\nsed           S2        ^ab+$               abb       FAIL abb\nsed           S2        ^ab\\+$              abb       OK\nsed           S2        ^ab\\\\+$             abb       FAIL abb\nsed           S2        ^ab{1}$             ab        FAIL ab\nsed           S2        ^ab\\{1}$            ab        FAIL sed: -e expression #1, char 13: Unmatched \\{\nsed           S2        ^ab\\{1\\}$           ab        OK\nsed           S2        ^ab\\\\{1\\\\}$         ab        FAIL ab\nsed           S2        ^ab{1,}$            abb       FAIL abb\nsed           S2        ^ab\\{1,}$           abb       FAIL sed: -e expression #1, char 14: Unmatched \\{\nsed           S2        ^ab\\{1,\\}$          abb       OK\nsed           S2        ^ab\\\\{1,\\\\}$        abb       FAIL abb\nsed           S2        ^ab{1,2}$           abb       FAIL abb\nsed           S2        ^ab\\{1,2}$          abb       FAIL sed: -e expression #1, char 15: Unmatched \\{\nsed           S2        ^ab\\{1,2\\}$         abb       OK\nsed           S2        ^ab\\\\{1,2\\\\}$       abb       FAIL abb\nsed           ax123     ^a(b)$              ab        FAIL ab\nsed           ax123     ^a\\(b\\)$            ab        OK\nsed           ax123     ^a\\\\(b\\\\)$          ab        FAIL ab\nsed           ax123     ^(x|ab)$            ab        FAIL ab\nsed           ax123     ^\\(x\\|ab\\)$         ab        OK\nsed           ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL ab\nsed           ax5       ^a\\_$               a\\_       FAIL a\\_\nsed           ax5       ^a\\\\_$              a\\_       OK\nsed           ax5       ^a\\\\\\\\_$            a\\_       FAIL a\\_\nsed           ax5       ^a\\.b$              a.b       OK\nsed           ax5       ^a\\\\.b$             a.b       FAIL a.b\nsed           ax5       ^a*b$               a*b       FAIL a*b\nsed           ax5       ^a\\*b$              a*b       OK\nsed           ax5       ^a\\\\*b$             a*b       FAIL a*b\nsed           ax5       ^a[b$               a[b       FAIL sed: -e expression #1, char 10: unterminated `s' command\nsed           ax5       ^a\\[b$              a[b       OK\nsed           ax5       ^a\\\\[b$             a[b       FAIL sed: -e expression #1, char 12: unterminated `s' command\nsed           ax5       ^a]b$               a]b       OK\nsed           ax5       ^a\\]b$              a]b       OK\nsed           ax5       ^a\\\\]b$             a]b       FAIL a]b\nsed           ax5       ^a{b$               a{b       OK\nsed           ax5       ^a\\{b$              a{b       FAIL sed: -e expression #1, char 11: Unmatched \\{\nsed           ax5       ^a\\\\{b$             a{b       FAIL a{b\nsed           ax5       ^a}b$               a}b       OK\nsed           ax5       ^a\\}b$              a}b       OK\nsed           ax5       ^a\\\\}b$             a}b       FAIL a}b\nsed           ax5       ^a{5}b$             a{5}b     OK\nsed           ax5       ^a\\{5\\}b$           a{5}b     FAIL a{5}b\nsed           ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL a{5}b\nsed           ax5       ^a(b$               a(b       OK\nsed           ax5       ^a\\(b$              a(b       FAIL sed: -e expression #1, char 11: Unmatched ( or \\(\nsed           ax5       ^a\\\\(b$             a(b       FAIL a(b\nsed           ax5       ^a)b$               a)b       OK\nsed           ax5       ^a\\)b$              a)b       FAIL sed: -e expression #1, char 11: Unmatched ) or \\)\nsed           ax5       ^a\\\\)b$             a)b       FAIL a)b\nsed           ax5       ^(a|b)$             (a|b)     OK\nsed           ax5       ^\\(a\\|b\\)$          (a|b)     FAIL (a|b)\nsed           ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL (a|b)\nsed           ax5       ^a+b$               a+b       OK\nsed           ax5       ^a\\+b$              a+b       FAIL a+b\nsed           ax5       ^a\\\\+b$             a+b       FAIL a+b\nsed           ax5       ^a?b$               a?b       OK\nsed           ax5       ^a\\?b$              a?b       FAIL a?b\nsed           ax5       ^a\\\\?b$             a?b       FAIL a?b\nsed           ax5       ^a^b$               a^b       OK\nsed           ax5       ^a\\^b$              a^b       OK\nsed           ax5       ^a\\\\^b$             a^b       FAIL a^b\nsed           ax5       ^a$b$               a$b       OK\nsed           ax5       ^a\\$b$              a$b       OK\nsed           ax5       ^a\\\\$b$             a$b       FAIL a$b\nsed           ax6       ^a[\\]_$             a\\_       OK\nsed           ax6       ^a[\\\\]_$            a\\_       OK\nsed           ax6       ^a[\\\\\\\\]_$          a\\_       OK\nsed           ax7       ^a[[:alpha:]]$      ab        OK\nsed           ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\ntcl version: tcl 8.6\ntcl           -         ^a.$                ab        OK\ntcl           -         ^[a]b$              ab        OK\ntcl           -         ^[^b]b$             ab        OK\ntcl           S2        ^abx?$              ab        OK\ntcl           S2        ^abx\\?$             ab        FAIL ab\ntcl           S2        ^abx\\\\?$            ab        FAIL ab\ntcl           S2        ^abx*$              ab        OK\ntcl           S2        ^abx\\*$             ab        FAIL ab\ntcl           S2        ^abx\\\\*$            ab        FAIL ab\ntcl           S2        ^ab+$               abb       OK\ntcl           S2        ^ab\\+$              abb       FAIL abb\ntcl           S2        ^ab\\\\+$             abb       FAIL abb\ntcl           S2        ^ab{1}$             ab        OK\ntcl           S2        ^ab\\{1}$            ab        FAIL extra characters after close-brace\ntcl           S2        ^ab\\{1\\}$           ab        FAIL ab\ntcl           S2        ^ab\\\\{1\\\\}$         ab        FAIL couldn't compile regular expression pattern: invalid repetition count(s)\ntcl           S2        ^ab{1,}$            abb       OK\ntcl           S2        ^ab\\{1,}$           abb       FAIL extra characters after close-brace\ntcl           S2        ^ab\\{1,\\}$          abb       FAIL abb\ntcl           S2        ^ab\\\\{1,\\\\}$        abb       FAIL couldn't compile regular expression pattern: invalid repetition count(s)\ntcl           S2        ^ab{1,2}$           abb       OK\ntcl           S2        ^ab\\{1,2}$          abb       FAIL extra characters after close-brace\ntcl           S2        ^ab\\{1,2\\}$         abb       FAIL abb\ntcl           S2        ^ab\\\\{1,2\\\\}$       abb       FAIL couldn't compile regular expression pattern: invalid repetition count(s)\ntcl           ax123     ^a(b)$              ab        OK\ntcl           ax123     ^a\\(b\\)$            ab        FAIL ab\ntcl           ax123     ^a\\\\(b\\\\)$          ab        FAIL ab\ntcl           ax123     ^(x|ab)$            ab        OK\ntcl           ax123     ^\\(x\\|ab\\)$         ab        FAIL ab\ntcl           ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL ab\ntcl           ax5       ^a\\_$               a\\_       FAIL a\\_\ntcl           ax5       ^a\\\\_$              a\\_       OK\ntcl           ax5       ^a\\\\\\\\_$            a\\_       FAIL a\\_\ntcl           ax5       ^a\\.b$              a.b       OK\ntcl           ax5       ^a\\\\.b$             a.b       FAIL a.b\ntcl           ax5       ^a*b$               a*b       FAIL a*b\ntcl           ax5       ^a\\*b$              a*b       OK\ntcl           ax5       ^a\\\\*b$             a*b       FAIL a*b\ntcl           ax5       ^a[b$               a[b       FAIL\ntcl           ax5       ^a\\[b$              a[b       FAIL\ntcl           ax5       ^a\\\\[b$             a[b       FAIL\ntcl           ax5       ^a]b$               a]b       OK\ntcl           ax5       ^a\\]b$              a]b       OK\ntcl           ax5       ^a\\\\]b$             a]b       FAIL a]b\ntcl           ax5       ^a{b$               a{b       FAIL\ntcl           ax5       ^a\\{b$              a{b       OK\ntcl           ax5       ^a\\\\{b$             a{b       FAIL\ntcl           ax5       ^a}b$               a}b       FAIL extra characters after close-brace\ntcl           ax5       ^a\\}b$              a}b       OK\ntcl           ax5       ^a\\\\}b$             a}b       FAIL extra characters after close-brace\ntcl           ax5       ^a{5}b$             a{5}b     FAIL a{5}b\ntcl           ax5       ^a\\{5\\}b$           a{5}b     OK\ntcl           ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL couldn't compile regular expression pattern: invalid repetition count(s)\ntcl           ax5       ^a(b$               a(b       FAIL couldn't compile regular expression pattern: parentheses () not balanced\ntcl           ax5       ^a\\(b$              a(b       OK\ntcl           ax5       ^a\\\\(b$             a(b       FAIL couldn't compile regular expression pattern: parentheses () not balanced\ntcl           ax5       ^a)b$               a)b       FAIL couldn't compile regular expression pattern: parentheses () not balanced\ntcl           ax5       ^a\\)b$              a)b       OK\ntcl           ax5       ^a\\\\)b$             a)b       FAIL couldn't compile regular expression pattern: parentheses () not balanced\ntcl           ax5       ^(a|b)$             (a|b)     FAIL (a|b)\ntcl           ax5       ^\\(a\\|b\\)$          (a|b)     OK\ntcl           ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL (a|b)\ntcl           ax5       ^a+b$               a+b       FAIL a+b\ntcl           ax5       ^a\\+b$              a+b       OK\ntcl           ax5       ^a\\\\+b$             a+b       FAIL a+b\ntcl           ax5       ^a?b$               a?b       FAIL a?b\ntcl           ax5       ^a\\?b$              a?b       OK\ntcl           ax5       ^a\\\\?b$             a?b       FAIL a?b\ntcl           ax5       ^a^b$               a^b       FAIL a^b\ntcl           ax5       ^a\\^b$              a^b       OK\ntcl           ax5       ^a\\\\^b$             a^b       FAIL a^b\ntcl           ax5       ^a$b$               a$b       FAIL can't read \"b\": no such variable\ntcl           ax5       ^a\\$b$              a$b       FAIL can't read \"b\": no such variable\ntcl           ax5       ^a\\\\$b$             a$b       FAIL can't read \"b\": no such variable\ntcl           ax6       ^a[\\]_$             a\\_       FAIL couldn't compile regular expression pattern: brackets [] not balanced\ntcl           ax6       ^a[\\\\]_$            a\\_       OK\ntcl           ax6       ^a[\\\\\\\\]_$          a\\_       OK\ntcl           ax7       ^a[[:alpha:]]$      ab        OK\ntcl           ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\nvim version: VIM - Vi IMproved 8.0 (2016 Sep 12)\nvim           -         ^a.$                ab        OK\nvim           -         ^[a]b$              ab        OK\nvim           -         ^[^b]b$             ab        OK\nvim           S2        ^abx?$              ab        FAIL ab\nvim           S2        ^abx\\?$             ab        OK\nvim           S2        ^abx\\\\?$            ab        FAIL ab\nvim           S2        ^abx*$              ab        OK\nvim           S2        ^abx\\*$             ab        FAIL ab\nvim           S2        ^abx\\\\*$            ab        FAIL ab\nvim           S2        ^ab+$               abb       FAIL abb\nvim           S2        ^ab\\+$              abb       OK\nvim           S2        ^ab\\\\+$             abb       FAIL abb\nvim           S2        ^ab{1}$             ab        FAIL ab\nvim           S2        ^ab\\{1}$            ab        OK\nvim           S2        ^ab\\{1\\}$           ab        OK\nvim           S2        ^ab\\\\{1\\\\}$         ab        FAIL ab\nvim           S2        ^ab{1,}$            abb       FAIL abb\nvim           S2        ^ab\\{1,}$           abb       OK\nvim           S2        ^ab\\{1,\\}$          abb       OK\nvim           S2        ^ab\\\\{1,\\\\}$        abb       FAIL abb\nvim           S2        ^ab{1,2}$           abb       FAIL abb\nvim           S2        ^ab\\{1,2}$          abb       OK\nvim           S2        ^ab\\{1,2\\}$         abb       OK\nvim           S2        ^ab\\\\{1,2\\\\}$       abb       FAIL abb\nvim           ax123     ^a(b)$              ab        FAIL ab\nvim           ax123     ^a\\(b\\)$            ab        OK\nvim           ax123     ^a\\\\(b\\\\)$          ab        FAIL ab\nvim           ax123     ^(x|ab)$            ab        FAIL ab\nvim           ax123     ^\\(x\\|ab\\)$         ab        OK\nvim           ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL ab\nvim           ax5       ^a\\_$               a\\_       FAIL a\\_\nvim           ax5       ^a\\\\_$              a\\_       OK\nvim           ax5       ^a\\\\\\\\_$            a\\_       FAIL a\\_\nvim           ax5       ^a\\.b$              a.b       OK\nvim           ax5       ^a\\\\.b$             a.b       FAIL a.b\nvim           ax5       ^a*b$               a*b       FAIL a*b\nvim           ax5       ^a\\*b$              a*b       OK\nvim           ax5       ^a\\\\*b$             a*b       FAIL a*b\nvim           ax5       ^a[b$               a[b       FAIL a[b\nvim           ax5       ^a\\[b$              a[b       OK\nvim           ax5       ^a\\\\[b$             a[b       FAIL a[b\nvim           ax5       ^a]b$               a]b       OK\nvim           ax5       ^a\\]b$              a]b       OK\nvim           ax5       ^a\\\\]b$             a]b       FAIL a]b\nvim           ax5       ^a{b$               a{b       OK\nvim           ax5       ^a\\{b$              a{b       FAIL a{b\nvim           ax5       ^a\\\\{b$             a{b       FAIL a{b\nvim           ax5       ^a}b$               a}b       OK\nvim           ax5       ^a\\}b$              a}b       OK\nvim           ax5       ^a\\\\}b$             a}b       FAIL a}b\nvim           ax5       ^a{5}b$             a{5}b     OK\nvim           ax5       ^a\\{5\\}b$           a{5}b     FAIL a{5}b\nvim           ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL a{5}b\nvim           ax5       ^a(b$               a(b       OK\nvim           ax5       ^a\\(b$              a(b       FAIL a(b\nvim           ax5       ^a\\\\(b$             a(b       FAIL a(b\nvim           ax5       ^a)b$               a)b       OK\nvim           ax5       ^a\\)b$              a)b       FAIL a)b\nvim           ax5       ^a\\\\)b$             a)b       FAIL a)b\nvim           ax5       ^(a|b)$             (a|b)     OK\nvim           ax5       ^\\(a\\|b\\)$          (a|b)     FAIL (a|b)\nvim           ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL (a|b)\nvim           ax5       ^a+b$               a+b       OK\nvim           ax5       ^a\\+b$              a+b       FAIL a+b\nvim           ax5       ^a\\\\+b$             a+b       FAIL a+b\nvim           ax5       ^a?b$               a?b       OK\nvim           ax5       ^a\\?b$              a?b       FAIL a?b\nvim           ax5       ^a\\\\?b$             a?b       FAIL a?b\nvim           ax5       ^a^b$               a^b       OK\nvim           ax5       ^a\\^b$              a^b       OK\nvim           ax5       ^a\\\\^b$             a^b       FAIL a^b\nvim           ax5       ^a$b$               a$b       OK\nvim           ax5       ^a\\$b$              a$b       OK\nvim           ax5       ^a\\\\$b$             a$b       FAIL a$b\nvim           ax6       ^a[\\]_$             a\\_       FAIL a\\_\nvim           ax6       ^a[\\\\]_$            a\\_       OK\nvim           ax6       ^a[\\\\\\\\]_$          a\\_       OK\nvim           ax7       ^a[[:alpha:]]$      ab        OK\nvim           ax8       ^a[\\t]b$            a<tab>b   OK\n----------------------------------------------------------\nvi version: nvi 1.81.6-13\nvi            -         ^a.$                ab        OK\nvi            -         ^[a]b$              ab        OK\nvi            -         ^[^b]b$             ab        OK\nvi            S2        ^abx?$              ab        FAIL script, 2: No match found\nvi            S2        ^abx\\?$             ab        FAIL script, 2: No match found\nvi            S2        ^abx\\\\?$            ab        FAIL script, 2: No match found\nvi            S2        ^abx*$              ab        OK\nvi            S2        ^abx\\*$             ab        FAIL script, 2: No match found\nvi            S2        ^abx\\\\*$            ab        FAIL script, 2: No match found\nvi            S2        ^ab+$               abb       FAIL script, 2: No match found\nvi            S2        ^ab\\+$              abb       FAIL script, 2: No match found\nvi            S2        ^ab\\\\+$             abb       FAIL script, 2: No match found\nvi            S2        ^ab{1}$             ab        FAIL script, 2: No match found\nvi            S2        ^ab\\{1}$            ab        FAIL script, 2: RE error: braces not balanced\nvi            S2        ^ab\\{1\\}$           ab        OK\nvi            S2        ^ab\\\\{1\\\\}$         ab        FAIL script, 2: No match found\nvi            S2        ^ab{1,}$            abb       FAIL script, 2: No match found\nvi            S2        ^ab\\{1,}$           abb       FAIL script, 2: RE error: braces not balanced\nvi            S2        ^ab\\{1,\\}$          abb       OK\nvi            S2        ^ab\\\\{1,\\\\}$        abb       FAIL script, 2: No match found\nvi            S2        ^ab{1,2}$           abb       FAIL script, 2: No match found\nvi            S2        ^ab\\{1,2}$          abb       FAIL script, 2: RE error: braces not balanced\nvi            S2        ^ab\\{1,2\\}$         abb       OK\nvi            S2        ^ab\\\\{1,2\\\\}$       abb       FAIL script, 2: No match found\nvi            ax123     ^a(b)$              ab        FAIL script, 2: No match found\nvi            ax123     ^a\\(b\\)$            ab        OK\nvi            ax123     ^a\\\\(b\\\\)$          ab        FAIL script, 2: No match found\nvi            ax123     ^(x|ab)$            ab        FAIL script, 2: No match found\nvi            ax123     ^\\(x\\|ab\\)$         ab        FAIL script, 2: No match found\nvi            ax123     ^\\\\(x\\\\|ab\\\\)$      ab        FAIL script, 2: No match found\nvi            ax5       ^a\\_$               a\\_       FAIL script, 2: No match found\nvi            ax5       ^a\\\\_$              a\\_       OK\nvi            ax5       ^a\\\\\\\\_$            a\\_       FAIL script, 2: No match found\nvi            ax5       ^a\\.b$              a.b       OK\nvi            ax5       ^a\\\\.b$             a.b       FAIL script, 2: No match found\nvi            ax5       ^a*b$               a*b       FAIL script, 2: No match found\nvi            ax5       ^a\\*b$              a*b       OK\nvi            ax5       ^a\\\\*b$             a*b       FAIL script, 2: No match found\nvi            ax5       ^a[b$               a[b       FAIL script, 2: RE error: brackets ([ ]) not balanced\nvi            ax5       ^a\\[b$              a[b       OK\nvi            ax5       ^a\\\\[b$             a[b       FAIL script, 2: RE error: brackets ([ ]) not balanced\nvi            ax5       ^a]b$               a]b       OK\nvi            ax5       ^a\\]b$              a]b       OK\nvi            ax5       ^a\\\\]b$             a]b       FAIL script, 2: No match found\nvi            ax5       ^a{b$               a{b       OK\nvi            ax5       ^a\\{b$              a{b       FAIL script, 2: RE error: invalid repetition count(s)\nvi            ax5       ^a\\\\{b$             a{b       FAIL script, 2: No match found\nvi            ax5       ^a}b$               a}b       OK\nvi            ax5       ^a\\}b$              a}b       FAIL script, 2: RE error: parentheses not balanced\nvi            ax5       ^a\\\\}b$             a}b       FAIL script, 2: No match found\nvi            ax5       ^a{5}b$             a{5}b     OK\nvi            ax5       ^a\\{5\\}b$           a{5}b     FAIL script, 2: No match found\nvi            ax5       ^a\\\\{5\\\\}b$         a{5}b     FAIL script, 2: No match found\nvi            ax5       ^a(b$               a(b       OK\nvi            ax5       ^a\\(b$              a(b       FAIL script, 2: RE error: parentheses not balanced\nvi            ax5       ^a\\\\(b$             a(b       FAIL script, 2: No match found\nvi            ax5       ^a)b$               a)b       OK\nvi            ax5       ^a\\)b$              a)b       FAIL script, 2: RE error: parentheses not balanced\nvi            ax5       ^a\\\\)b$             a)b       FAIL script, 2: No match found\nvi            ax5       ^(a|b)$             (a|b)     OK\nvi            ax5       ^\\(a\\|b\\)$          (a|b)     FAIL script, 2: No match found\nvi            ax5       ^\\\\(a\\\\|b\\\\)$       (a|b)     FAIL script, 2: No match found\nvi            ax5       ^a+b$               a+b       OK\nvi            ax5       ^a\\+b$              a+b       OK\nvi            ax5       ^a\\\\+b$             a+b       FAIL script, 2: No match found\nvi            ax5       ^a?b$               a?b       OK\nvi            ax5       ^a\\?b$              a?b       OK\nvi            ax5       ^a\\\\?b$             a?b       FAIL script, 2: No match found\nvi            ax5       ^a^b$               a^b       OK\nvi            ax5       ^a\\^b$              a^b       OK\nvi            ax5       ^a\\\\^b$             a^b       FAIL script, 2: No match found\nvi            ax5       ^a$b$               a$b       OK\nvi            ax5       ^a\\$b$              a$b       OK\nvi            ax5       ^a\\\\$b$             a$b       FAIL script, 2: No match found\nvi            ax6       ^a[\\]_$             a\\_       OK\nvi            ax6       ^a[\\\\]_$            a\\_       OK\nvi            ax6       ^a[\\\\\\\\]_$          a\\_       OK\nvi            ax7       ^a[[:alpha:]]$      ab        OK\nvi            ax8       ^a[\\t]b$            a<tab>b   FAIL script, 2: No match found\n----------------------------------------------------------\n"
  },
  {
    "path": "txt2regex.sh",
    "content": "#!/bin/bash\n# txt2regex.sh - Regular Expressions \"wizard\" made with Bash builtins\n#\n# Website : https://aurelio.net/projects/txt2regex/\n# Author  : Aurelio Jargas (verde@aurelio.net)\n# License : GPL\n# Requires: bash >= 3.0\n#\n# shellcheck disable=SC1117,SC2034\n#   SC1117 because it was obsoleted in shellcheck >0.5\n#   SC2034 because it considers unused vars that I load with eval (ax_*)\n#\n# Please, read the README file.\n#\n# $STATUS:\n#   0  beginning of the regex\n#   1  defining regex\n#   12 choosing subregex\n#   2  defining quantifier\n#   3  really quit?\n#   4  choosing session programs\n#   9  end of the regex\n#\n# 20001019 ** 1st version\n# 20001026 ++ lots of changes and tests\n# 20001028 ++ improvements, public release\n# 20001107 ++ bash version check (thanks eliphas)\n# 20001113 ++ php support, Progs command\n# 20010223 ++ i18n, --all, freshmeat announce (oh no!)\n# 20010223 v0.1\n# 20010420 ++ id.po, \\lfunction_name, s/regexp/regex/ig\n# 20010423 ++ --nocolor, --history, Usage(), doNextHist{,Args}()\n#          ++ flags: interactive, color, allprogs\n#          ++ .oO(¤user parameters history)\n# 20010424 v0.2\n# 20010606 ++ option --whitebg\n#          -- grep from $progs to fit on 24 lines by default\n# 20010608 -- clear command (not bash), ++ Clear()\n#          -- stty command (not bash), ++ $LINES\n#          -- *Progs*(), ++ Choice(), ChoiceRefresh()\n#          ++ POSIX character classes [[:abc:]]\n#          ++ special combinations inside []\n#          ++ $HUMAN improved with getString, getNumber, Choice\n#          ++ detailed --help, moved to sourceforge\n# 20010613 v0.3\n# 20010620 -- seq command (not bash), ++ sek()\n# 20010613 v0.3.1\n# 20010731 ++ Reset: \"RegEx prog  :\" with automatic length\n#          ++ new progs: postgres, javascript, vbscript, procmail\n#          ++ ax_prog: new item: escape char - escape is ok now\n#          ++ improved meta knowledge on perl, tcl and gawk\n# 20010802 v0.4\n# 20010821 ++ ShowMeta(), new option: --showmeta\n# 20010824 ++ getMeta(), ShowInfo(), new option: --showinfo, $cR color\n# 20010828 ++ getItemIndex(), getLargestItem()\n#          <> Clear(): using \\033c, ALL: using for((;;)) ksh syntax\n#          <> vi == Nvi\n# 20010828 v0.5\n# 20010831 ++ group & or support- cool!, clearN()\n#          ++ nice groups balance check -> ((2)), use $COLUMNS\n#          <> TopTitle(): BLOAT, 3 lines, smart, arrays\n#          <> Menu(): s/stupid recursion/while/\n#          ++ Z status to handle 0,menu,0 situation\n#          <> s/eval/${!var}/\n# 20010903 <> Choice: fixed outrange answers\n#          ++ trapping ^c do clearEnd, ++ new prog: mysql\n#          ++ history now works with Choice() menus\n#          ++ history appears when quitting\n# 20010905 v0.6\n# 20020225 ++ \"really quit?\" message, ++ --version\n# 20020304 <> --history just shows final RE on STDOUT\n#          ++ --make, --prog, printError()\n#          ++ groups are now quantifiable\n#          ++ ready_(date[123], hour[123], number[123])\n# 20020304 v0.7\n# 20040928 <> bash version test (works in 3.x and newer)\n# 20040928 v0.8\n# 20040929 <> --help split into individual messages (helps i18n)\n# 20051229 <> fixed bug on bash3 for eval contents (thanks Marcus Habermehl)\n# 20121221 ** moved to GitHub, please see the Git history from now on\n\n# Every command in this script is a Bash builtin. This is by design.\n# Make sure we don't break that rule in future code by strictly\n# disallowing any system command.\nexport PATH=\n\nTEXTDOMAIN=txt2regex\nTEXTDOMAINDIR=po\nVERSION=0.10b\n\nprintError() {\n    printf '%s: ' $\"ERROR\"\n    # shellcheck disable=SC2059\n    printf \"$@\"\n    exit 1\n}\n\ncase \"$BASH_VERSION\" in\n    [3-9].*)\n        : # do nothing\n        ;;\n    *)\n        printError 'Bash version >=3.0 required, but you have %s\\n' \"$BASH_VERSION\"\n        ;;\nesac\n\nUsage() {\n    # Ugly code, but isolates in $\"...\" only the strings that need\n    # translation and tries to keep the option descriptions aligned even\n    # when long words are used as meta vars.\n    printf '%s txt2regex [--nocolor|--whitebg] [--all|--prog %s]\\n' \\\n        $\"usage:\" $\"PROGRAMS\"\n    printf '%s txt2regex --showmeta\\n' \\\n        $\"usage:\"\n    printf '%s txt2regex --showinfo %s [--nocolor]\\n' \\\n        $\"usage:\" $\"PROGRAM\"\n    printf '%s txt2regex --history %s [--all|--prog %s]\\n' \\\n        $\"usage:\" $\"VALUE\" $\"PROGRAMS\"\n    printf '%s txt2regex --make %s [--all|--prog %s]\\n' \\\n        $\"usage:\" $\"LABEL\" $\"PROGRAMS\"\n    printf '\\n'\n    printf '%s\\n' $\"Options:\"\n    printf '  %-22s%s\\n' '--all' \\\n        $\"Select all the available programs\"\n    printf '  %-22s%s\\n' '--nocolor' \\\n        $\"Do not use colors\"\n    printf '  %-22s%s\\n' '--whitebg' \\\n        $\"Adjust colors for white background terminals\"\n    printf '  %-22s%s\\n' '--prog '$\"PROGRAMS\" \\\n        $\"Specify which programs to use, separated by commas\"\n    printf '\\n'\n    printf '  %-22s%s\\n' '--showmeta' \\\n        $\"Print a metacharacters table featuring all the programs\"\n    printf '  %-22s%s\\n' '--showinfo '$\"PROGRAM\" \\\n        $\"Print regex-related info about the specified program\"\n    printf '  %-22s%s\\n' '--history '$\"VALUE\" \\\n        $\"Print a regex from the given history data\"\n    printf '  %-22s%s\\n' '--make '$\"LABEL\" \\\n        $\"Print a ready regex for the specified label\"\n    printf '\\n'\n    printf '  %-22s%s\\n' '-V, --version' \\\n        $\"Print the program version and quit\"\n    printf '  %-22s%s\\n' '-h, --help' \\\n        $\"Print the help message and quit\"\n    printf '\\n'\n    exit \"${1:-0}\" # $1 is the exit code (default is 0)\n}\n\n# The defaults\nis_interactive=1\nuse_colors=1\nhas_white_background=0\nhas_not_supported=0\nmode_show_meta=0\nmode_show_info=0\nGRP1=0\nGRP2=0\n\n# Here's the default list of programs shown.\n# Edit here or use --prog to overwrite it.\nprogs=(python egrep grep sed vim emacs)\n\n### IMPORTANT DATA ###\n\n# To generate this array:\n# grep version: tests/regex-tester.txt | sort | cut -d ' ' -f 1\nallprogs=(\n    awk\n    chicken\n    ed\n    egrep\n    emacs\n    expect\n    find\n    gawk\n    grep\n    javascript\n    lex\n    mawk\n    mysql\n    perl\n    php\n    postgres\n    procmail\n    python\n    sed\n    tcl\n    vi\n    vim\n)\n\n# To generate this array:\n# grep version: tests/regex-tester.txt | sort | sed \"s/.* version: //;s/.*/'&'/\"\nallversions=(\n    'awk version 20121220'\n    'CHICKEN 4.12.0'\n    'GNU Ed 1.10'\n    'grep (GNU grep) 3.1'\n    'GNU Emacs 25.2.2'\n    'expect version 5.45.4'\n    'find (GNU findutils) 4.7.0-git'\n    'GNU Awk 4.1.4'\n    'grep (GNU grep) 3.1'\n    'node v8.10.0'\n    'flex 2.6.4'\n    'mawk 1.3.3 Nov 1996'\n    'mysql  Ver 14.14 Distrib 5.7.29'\n    'perl v5.26.1'\n    'PHP 7.2.24-0ubuntu0.18.04.4'\n    'psql (PostgreSQL) 10.12'\n    'procmail v3.23pre 2001/09/13'\n    'Python 3.6.9'\n    'sed (GNU sed) 4.4'\n    'tcl 8.6'\n    'nvi 1.81.6-13'\n    'VIM - Vi IMproved 8.0 (2016 Sep 12)'\n)\n\nlabel_names=(\n    date\n    date2\n    date3\n    hour\n    hour2\n    hour3\n    number\n    number2\n    number3\n)\nlabel_descriptions=(\n    'date LEVEL 1: mm/dd/yyyy: matches from 00/00/0000 to 99/99/9999'\n    'date LEVEL 2: mm/dd/yyyy: matches from 00/00/1000 to 19/39/2999'\n    'date LEVEL 3: mm/dd/yyyy: matches from 00/00/1000 to 12/31/2999'\n    'hour LEVEL 1: hh:mm: matches from 00:00 to 99:99'\n    'hour LEVEL 2: hh:mm: matches from 00:00 to 29:59'\n    'hour LEVEL 3: hh:mm: matches from 00:00 to 23:59'\n    'number LEVEL 1: integer, positive and negative'\n    'number LEVEL 2: level 1 plus optional float point'\n    'number LEVEL 3: level 2 plus optional commas, like: 34,412,069.90'\n)\nlabel_data=(\n    # date\n    '26521652165¤:2¤2¤/¤:2¤2¤/¤:2¤4'\n    '24161214161214165¤01¤:2¤/¤0123¤:2¤/¤12¤:2¤3'\n    '2(2161|2141)121(2161|4161|2141)1214165¤0¤:2¤1¤012¤/¤0¤:2¤12¤:2¤3¤01¤/¤12¤:2¤3'\n    # hour\n    '2652165¤:2¤2¤:¤:2¤2'\n    '24161214161¤012¤:2¤:¤012345¤:2'\n    '2(4161|2141)1214161¤01¤:2¤2¤0123¤:¤012345¤:2'\n    # number\n    '24264¤+-¤:2'\n    '24264(2165)2¤+-¤:2¤.¤:2¤2'\n    '24266(2165)3(2165)2¤+-¤:2¤3¤,¤:2¤3¤.¤:2¤2'\n)\n#date3  : perl: (0[0-9]|1[012])/(0[0-9]|[12][0-9]|3[01])/[12][0-9]{3}\n#hour3  : perl: ([01][0-9]|2[0123]):[012345][0-9]\n#number3: perl: [+-]?[0-9]{1,3}(,[0-9]{3})*(\\.[0-9]{2})?\n### -- ###\n\ngetItemIndex() { # item, array_items\n    local item=\"$1\"\n    local i=0\n\n    shift\n    while [ -n \"$1\" ]; do\n        [ \"$1\" == \"$item\" ] && printf '%d\\n' \"$i\" && return\n        i=$((i + 1))\n        shift\n    done\n}\n\nvalidateProgramNames() {\n    local name\n\n    for name in \"$@\"; do\n        [ -z \"$(getItemIndex \"$name\" \"${allprogs[@]}\")\" ] &&\n            printError '%s: %s\\n' $\"unknown program\" \"$name\"\n    done\n}\n\n# Parse command line options\nwhile [ $# -gt 0 ]; do\n    case \"$1\" in\n        --history)\n            [ -z \"$2\" ] && Usage 1\n            history=\"$2\"\n            shift\n            is_interactive=0\n            use_colors=0\n\n            hists=\"0${history%%¤*}\"\n            histargs=\"¤${history#*¤}\"\n            [ \"${hists#0}\" == \"${histargs#¤}\" ] && unset histargs\n            ;;\n        --make)\n            shift\n            is_interactive=0\n            use_colors=0\n            label_name=\"${1%1}\" # final 1 is optional (date1 == date)\n            label_index=$(getItemIndex \"$label_name\" \"${label_names[@]}\")\n\n            # Sanity check\n            [ -z \"$label_index\" ] &&\n                printError '%s: \"%s\": %s\\n%s %s\\n' \\\n                    '--make' \"$1\" $\"invalid argument\" \\\n                    $\"valid names:\" \"${label_names[*]}\"\n\n            # Set history data\n            hist=\"${label_data[$label_index]}\"\n            hists=\"0${hist%%¤*}\"\n            histargs=\"¤${hist#*¤}\"\n\n            printf '\\n### %s\\n\\n' \"${label_descriptions[$label_index]}\"\n            ;;\n        --prog)\n            [ -z \"$2\" ] && Usage 1\n            shift\n            eval \"progs=(${1//,/ })\"\n            validateProgramNames \"${progs[@]}\"\n            ;;\n        --nocolor)\n            use_colors=0\n            ;;\n        --whitebg)\n            has_white_background=1\n            ;;\n        --showmeta)\n            mode_show_meta=1\n            ;;\n        --showinfo)\n            [ -z \"$2\" ] && Usage 1\n            infoprog=\"$2\"\n            shift\n            mode_show_info=1\n            validateProgramNames \"$infoprog\"\n            ;;\n        --all)\n            progs=(\"${allprogs[@]}\")\n            ;;\n        -V | --version)\n            printf 'txt2regex %s\\n' \"$VERSION\"\n            exit 0\n            ;;\n        -h | --help)\n            Usage 0\n            ;;\n        *)\n            printf '%s: %s\\n\\n' \"$1\" $\"invalid option\"\n            Usage 1\n            ;;\n    esac\n    shift\ndone\n\nset -o noglob\n\n### The Regex show\n\nS0_txt=(\n    $\"start to match\"\n    $\"on the line beginning\"\n    $\"in any part of the line\"\n)\nS0_re=(\n    ''\n    '^'\n    ''\n)\n\nS1_txt=(\n    $\"followed by\"\n    $\"any character\"\n    $\"a specific character\"\n    $\"a literal string\"\n    $\"an allowed characters list\"\n    $\"a forbidden characters list\"\n    $\"a special combination\"\n    $\"a POSIX combination (locale aware)\"\n    $\"a ready regex (not implemented)\"\n    $\"anything\"\n)\nS1_re=(\n    ''\n    '.'\n    ''\n    ''\n    ''\n    ''\n    ''\n    ''\n    ''\n    '.*'\n)\n\nS2_txt=(\n    $\"how many times (repetition)\"\n    $\"one\"\n    $\"zero or one (optional)\"\n    $\"zero or more\"\n    $\"one or more\"\n    $\"exactly N\"\n    $\"up to N\"\n    $\"at least N\"\n)\n\n# COMBO\ncombo_txt=(\n    $\"uppercase letters\"\n    $\"lowercase letters\"\n    $\"numbers\"\n    $\"underscore\"\n    $\"space\"\n    $\"TAB\"\n)\ncombo_re=(\n    'A-Z'\n    'a-z'\n    '0-9'\n    '_'\n    ' '\n    '@'\n)\n\n#TODO use all posix components?\nposix_txt=(\n    $\"letters\"\n    $\"lowercase letters\"\n    $\"uppercase letters\"\n    $\"numbers\"\n    $\"letters and numbers\"\n    $\"hexadecimal numbers\"\n    $\"whitespaces (space and TAB)\"\n    $\"graphic chars (not-whitespace)\"\n)\nposix_re=(\n    'alpha'\n    'lower'\n    'upper'\n    'digit'\n    'alnum'\n    'xdigit'\n    'blank'\n    'graph'\n)\n\n# Title (line 1)\n# shellcheck disable=SC2256\ntit1_txt=(\n    $\"quit\"\n    $\"reset\"\n    $\"color\"\n    $\"programs\"\n    ''\n    ''\n    ''\n    ''\n    ''\n    '^txt2regex$'\n)\ntit1_cmd=(\n    '.'\n    '0'\n    '*'\n    '/'\n    ''\n    ''\n    ''\n    ''\n    ''\n    ''\n)\n\n# Title (line 2-3)\ntit2_txt=(\n    $\"or\"\n    $\"open group\"\n    $\"close group\"\n    ''\n    ''\n    ''\n    ''\n    ''\n    ''\n    $\"not supported\"\n)\ntit2_cmd=(\n    '|'\n    '('\n    ')'\n    ''\n    ''\n    ''\n    ''\n    ''\n    ''\n    '!!'\n)\n\n# S2_* arrays: The list of quantifiers (to be used when STATUS=2)\n# Every array will be named S2_<prog>: S2_awk, S2_ed, S2_egrep, ...\n# The array index refers to the menu item in the \"repetition\" screen.\n# To update this data:\n#   make test-regex\n#   grep ' S2 .*OK$' tests/regex-tester.txt\n#\nwhile read -r prog_id data; do\n    # Set the S2_<prog> array for each line. Example:\n    # S2_egrep=('-' '-' '?' '*' '+' '{@}' '{1,@}' '{@,}')\n    read -r -a \"S2_$prog_id\" <<< \"$data\"\ndone << 'EOD'\nawk           - -     ?      *      +       !!         !!          !!\nchicken       - -     ?      *      +       {@}       {1,@}       {@,}\ned            - -    \\?      *     \\+      \\{@\\}     \\{1,@\\}     \\{@,\\}\negrep         - -     ?      *      +       {@}       {1,@}       {@,}\nemacs         - -     ?      *      +     \\\\{@\\\\}   \\\\{1,@\\\\}   \\\\{@,\\\\}\nexpect        - -     ?      *      +       {@}       {1,@}       {@,}\nfind          - -     ?      *      +       {@}       {1,@}       {@,}\ngawk          - -     ?      *      +       {@}       {1,@}       {@,}\ngrep          - -    \\?      *     \\+      \\{@\\}     \\{1,@\\}     \\{@,\\}\njavascript    - -     ?      *      +       {@}       {1,@}       {@,}\nlex           - -     ?      *      +       {@}       {1,@}       {@,}\nmawk          - -     ?      *      +       !!         !!          !!\nmysql         - -     ?      *      +       {@}       {1,@}       {@,}\nperl          - -     ?      *      +       {@}       {1,@}       {@,}\nphp           - -     ?      *      +       {@}       {1,@}       {@,}\npostgres      - -     ?      *      +       {@}       {1,@}       {@,}\nprocmail      - -     ?      *      +       !!         !!          !!\npython        - -     ?      *      +       {@}       {1,@}       {@,}\nsed           - -    \\?      *     \\+      \\{@\\}     \\{1,@\\}     \\{@,\\}\ntcl           - -     ?      *      +       {@}       {1,@}       {@,}\nvi            - -  \\{0,1\\}   *   \\{1,\\}    \\{@\\}     \\{1,@\\}     \\{@,\\}\nvim           - -    \\=      *     \\+      \\{@}      \\{1,@}      \\{@,}\nEOD\n\n# ax_* arrays: Extra regex-related data for all the programs.\n# Every array will be named ax_<prog>: ax_awk, ax_ed, ax_egrep, ...\n# To check how this data is used in this source code, search for\n# something like 'ax_.*5'.\n#\n# To update this data:\n#   make test-regex\n#   grep -E ' ax123 .+OK$' tests/regex-tester.txt  # 1,2,3\n#   grep -E   ' a\\.b +OK$' tests/regex-tester.txt  # 4\n#   grep -E   ' ax5 .+OK$' tests/regex-tester.txt  # 5\n#   grep -E   ' ax6 '      tests/regex-tester.txt  # 6\n#   grep -E   ' ax7 '      tests/regex-tester.txt  # 7\n#   grep -E   ' ax8 '      tests/regex-tester.txt  # 8\n#\n# In PHP, we're using \\\\ instead of \\ as the escape metacharacter\n# because it works consistently, being it inside single or double\n# quotes. Using only \\ would work in some cases, but not in others:\n#   The literal + is matched by: \\+ \\\\+ [+] [\\+] [\\\\+]\n#   The literal \\ is matched by: \\\\\\\\ [\\\\\\\\]\n#\nwhile read -r prog_id data; do\n    # Set the ax_<prog> array for each line. Example:\n    # ax_awk=('' '|' '(' ')' '\\' '\\.*[---()|+?^$' '\\' 'P' '\\t')\n    read -r -a \"ax_$prog_id\" <<< \"$data\"\ndone << 'EOD'\nawk           -     |     (     )    \\    \\.*[---()|+?^$    \\    P    \\t\nchicken       -     |     (     )    \\\\   \\.*[---()|+?^$    \\    P    \\t\ned            -    \\|    \\(    \\)    \\    \\.*[----------    -    P    -\negrep         -     |     (     )    \\    \\.*[-{-(-|+?^$    -    P    -\nemacs         -   \\\\|   \\\\(   \\\\)    \\\\   \\.*[------+?--    \\    P    \\t\nexpect        -     |     (     )    \\    \\.*[-{}()|+?^$    \\    P    \\t\nfind          -     |     (     )    \\    \\.*[-{-(-|+?^$    -    P    -\ngawk          -     |     (     )    \\    \\.*[---(-|+?^$    \\    P    \\t\ngrep          -    \\|    \\(    \\)    \\    \\.*[----------    -    P    -\njavascript    -     |     (     )    \\    \\.*[---()|+?^$    \\    -    \\t\nlex           -     |     (     )    \\    \\.*[-{}()|+?--    \\    P    \\t\nmawk          -     |     (     )    \\    \\.*[---()|+?^$    \\    -    \\t\nmysql         -     |     (     )    \\\\   \\.*[---(-|+?^$    \\    P    \\t\nperl          -     |     (     )    \\    \\.*[-{-()|+?^$    \\    P    \\t\nphp           -     |     (     )    \\\\   \\.*[-{-()|+?^$    \\    P    \\t\npostgres      -     |     (     )    \\    \\.*[---()|+?^$    \\    P    \\t\nprocmail      -     |     (     )    \\    \\.*[---()|+?^$    -    -    -\npython        -     |     (     )    \\    \\.*[-{-()|+?^$    \\    -    \\t\nsed           -    \\|    \\(    \\)    \\    \\.*[----------    -    P    \\t\ntcl           -     |     (     )    \\    \\.*[-{}()|+?^$    \\    P    \\t\nvi            -    !!    \\(    \\)    \\    \\.*[----------    -    P    -\nvim           -    \\|    \\(    \\)    \\    \\.*[----------    \\    P    \\t\nEOD\n#                                         \\.*[]{}()|+?^$    -=false\n# [0] Unused\n# [1] Which is the metacharacter for alternatives?\n# [2,3] Which are the metacharacters for grouping?\n# [4] Which is the escape metacharacter?\n# [5] Which chars of \\.*[]{}()|+?^$ need to be escaped to be matched as\n#     literals? Note that txt2regex has menus to insert all of those as\n#     metacharacters (except $), so in user input they will always be\n#     literal. For ^ and $, some tools consider them literal when not in\n#     their special start/end position (marked here as -).\n# [6] To match '\\' inside [], do you need to escape it? If yes, use '\\'.\n# [7] Has support for [[:POSIX:]] character classes? If yes, use 'P'.\n# [8] Does \\t inside [] match a tab? If yes, use '\\t'.\n\nColorOnOff() {\n    # The colors: Normal, Prompt, Bold, Important\n    [ \"$use_colors\" -eq 0 ] && return\n    if [ -n \"$cN\" ]; then\n        unset cN cP cB cI cR\n    elif [ \"$has_white_background\" -eq 0 ]; then\n        cN=$(printf '\\033[m')     # normal\n        cP=$(printf '\\033[1;31m') # red\n        cB=$(printf '\\033[1;37m') # white\n        cI=$(printf '\\033[1;33m') # yellow\n        cR=$(printf '\\033[7m')    # reverse\n    else\n        cN=$(printf '\\033[m')   # normal\n        cP=$(printf '\\033[31m') # red\n        cB=$(printf '\\033[32m') # green\n        cI=$(printf '\\033[34m') # blue\n        cR=$(printf '\\033[7m')  # reverse\n    fi\n}\n\n# Emulate the 'seq N' command\nsek() {\n    local z=\"$1\"\n    local a=1\n\n    while [ \"$a\" -le \"$z\" ]; do\n        printf '%d\\n' \"$a\"\n        a=$((a + 1))\n    done\n}\n\n# Is the $1 char present in the $2 text?\ncharInText() {\n    local char=\"$1\"\n    local text=\"$2\"\n    local i\n\n    for ((i = 0; i < ${#text}; i++)); do\n        [ \"${text:$i:1}\" == \"$char\" ] && return 0\n    done\n    return 1\n}\n\n# Remove all duplicated chars from the $1 text\nuniqChars() {\n    local text=\"$1\"\n    local text_uniq=''\n    local i\n\n    for ((i = 0; i < ${#text}; i++)); do\n        charInText \"${text:$i:1}\" \"$text_uniq\" ||\n            text_uniq=\"$text_uniq${text:$i:1}\"\n    done\n    printf '%s\\n' \"$text_uniq\"\n}\n\n# Escape each $1 in $2 using $3\nescapeChars() {\n    local special_chars=\"$1\"\n    local text=\"$2\"\n    local escape_char=\"${3:-\\\\}\"\n\n    local escaped_text\n    local i\n    local this_char\n\n    for ((i = 0; i < ${#text}; i++)); do\n        this_char=${text:$i:1}\n\n        if charInText \"$this_char\" \"$special_chars\"; then\n            if [ \"$this_char$this_char\" == \"$escape_char\" ]; then\n                # Special case: this_char=\\ and escape_char=\\\\\n                # The normal escaping (see the next else) would make \\\\\\\n                # (which is wrong). Here we ensure \\\\\\\\ is produced.\n                escaped_text=\"$escaped_text$escape_char$escape_char\"\n            else\n                # normal escaping\n                escaped_text=\"$escaped_text$escape_char$this_char\"\n            fi\n        else\n            # no escaping\n            escaped_text=\"$escaped_text$this_char\"\n        fi\n    done\n    printf '%s\\n' \"$escaped_text\"\n}\n\ngetLargestItem() {\n    local largest\n    while [ -n \"$1\" ]; do\n        [ ${#1} -gt ${#largest} ] && largest=\"$1\"\n        shift\n    done\n    printf '%s\\n' \"$largest\"\n}\n\n# Used to get values from the S2_* and ax_* metachar arrays\ngetMeta() { # var-name index\n    local m=\"$1[$2]\"\n    m=${!m}\n\n    # Remove all non-metacharacters: @ ! -\n    # Those are used only internally as markers\n    m=${m//[@!-]/}\n\n    # Remove when getting '?' or '+' for 'vi', since they are unsupported\n    # and the current values are workarounds using '{}'\n    [ \"$1\" == S2_vi ] && { [ \"$2\" -eq 2 ] || [ \"$2\" -eq 4 ]; } && m=''\n\n    printf '%s\\n' \"$m\"\n}\n\nShowMeta() {\n    local i g1 g2 prog progsize\n    progsize=$(getLargestItem \"${allprogs[@]}\")\n    for ((i = 0; i < ${#allprogs[@]}; i++)); do\n        prog=${allprogs[$i]}\n        g1=$(getMeta \"ax_$prog\" 2)\n        g2=$(getMeta \"ax_$prog\" 3)\n\n        printf \"\\n%-${#progsize}s\" \"$prog\"     # name\n        printf '%7s' \"$(getMeta \"S2_$prog\" 4)\" # +\n        printf '%7s' \"$(getMeta \"S2_$prog\" 2)\" # ?\n        printf '%7s' \"$(getMeta \"S2_$prog\" 5)\" # {}\n        printf '%7s' \"$(getMeta \"ax_$prog\" 1)\" # |\n        printf '%8s' \"$g1$g2\"                  # ()\n        printf '    %s' \"${allversions[$i]}\"   # version\n    done\n    printf '\\n\\n%s\\n\\n' $\"NOTE: . [] [^] and * are the same on all programs.\"\n}\n\nShowInfo() {\n    local prog=\"$1\"\n\n    local escmeta\n    local index\n    local i\n    local metas\n    local needesc\n    local posix=$\"NO\"\n    local tabinlist=$\"NO\"\n    local txtsize\n    local ver\n\n    local -a data\n    local -a txt\n\n    # Getting data\n    index=$(getItemIndex \"$prog\" \"${allprogs[@]}\")\n    ver=\"${allversions[$index]}\"\n    escmeta=$(getMeta \"ax_$prog\" 4)\n    needesc=$(getMeta \"ax_$prog\" 5)\n    [ \"$(getMeta \"ax_$prog\" 7)\" == 'P' ] && posix=$\"YES\"\n    [ \"$(getMeta \"ax_$prog\" 8)\" == '\\t' ] && tabinlist=$\"YES\"\n\n    # Metacharacters list\n    # printf arguments: + ? {} | ( )\n    metas=\"$(\n        printf '. [] [^] * %s %s %s %s %s%s' \\\n            \"$(getMeta \"S2_$prog\" 4)\" \\\n            \"$(getMeta \"S2_$prog\" 2)\" \\\n            \"$(getMeta \"S2_$prog\" 5)\" \\\n            \"$(getMeta \"ax_$prog\" 1)\" \\\n            \"$(getMeta \"ax_$prog\" 2)\" \\\n            \"$(getMeta \"ax_$prog\" 3)\"\n    )\"\n\n    # Populating cool i18n arrays\n    # shellcheck disable=SC2256\n    txt=(\n        $\"program\"\n        $\"metas\"\n        $\"esc meta\"\n        $\"need esc\"\n        $\"\\t in []\"\n        '[:POSIX:]'\n    )\n    data=(\n        \"$prog: $ver\"\n        \"$metas\"\n        \"$escmeta\"\n        \"${needesc//-/}\"\n        \"$tabinlist\"\n        \"$posix\"\n    )\n\n    # Show me! show me! show me!\n    ColorOnOff\n    printf '\\n'\n    txtsize=$(getLargestItem \"${txt[@]}\")\n    for ((i = 0; i < ${#txt[@]}; i++)); do\n        printf \"%s %${#txtsize}s %s %s\\n\" \\\n            \"$cR\" \"${txt[$i]}\" \"${cN:-:}\" \"${data[$i]}\"\n    done\n    printf '\\n'\n}\n\nif [ \"$mode_show_meta\" -eq 1 ]; then\n    ShowMeta\n    exit 0\nfi\n\nif [ \"$mode_show_info\" -eq 1 ]; then\n    ShowInfo \"$infoprog\"\n    exit 0\nfi\n\n# Screen size/positioning issues\nScreenSize() {\n    # Note that those are all global variables\n    x_regex=1\n    y_regex=4\n    x_hist=3\n    y_hist=$((y_regex + ${#progs[*]} + 1))\n    x_prompt=3\n    y_prompt=$((y_regex + ${#progs[*]} + 2))\n    x_menu=3\n    y_menu=$((y_prompt + 2))\n    x_prompt2=15\n    y_max=$((y_menu + ${#S1_txt[*]}))\n\n    # The defaults case not exported\n    : ${LINES:=25}\n    : ${COLUMNS:=80}\n\n    #TODO automatic check when selecting programs\n    if [ \"$is_interactive\" -eq 1 ] && [ $LINES -lt \"$y_max\" ]; then\n        printError '\\n%s\\n%s\\n%s\\n' \\\n            \"$(\n                printf \\\n                    $\"Your terminal has %d lines, but txt2regex needs at least %d lines.\" \\\n                    \"$LINES\" \"$y_max\"\n            )\" \\\n            $\"Increase the number of lines or select less programs using --prog.\" \\\n            $\"If this line number detection is incorrect, export the LINES variable.\"\n    fi\n}\n\n_eol=$(printf '\\033[0K') # clear trash until EOL\n\n# The cool control chars functions\ngotoxy() {\n    [ \"$is_interactive\" -eq 1 ] && printf '\\033[%d;%dH' \"$2\" \"$1\"\n}\nclearEnd() {\n    [ \"$is_interactive\" -eq 1 ] && printf '\\033[0J'\n}\nclearN() {\n    [ \"$is_interactive\" -eq 1 ] && printf '\\033[%dX' \"$1\"\n}\nClear() {\n    [ \"$is_interactive\" -eq 1 ] && printf '\\033c'\n}\n\n# Ideas: tab between, $cR on cmd, yellow-white-yellow\nprintTitleCmd() {\n    printf '[%s%s%s]%s  ' \"$cI\" \"$1\" \"$cN\" \"$2\"\n}\n\nTopTitle() {\n    gotoxy 1 1\n\n    local color\n    local cmd\n    local i\n    local j\n    local showme\n    local txt\n\n    [ \"$is_interactive\" -eq 0 ] && return\n\n    # 1st line: aplication commands\n    for ((i = 0; i < 10; i++)); do\n        showme=0\n        txt=${tit1_txt[$i]}\n        cmd=${tit1_cmd[$i]}\n        case $i in\n            [01])\n                showme=1\n                ;;\n            2)\n                [ \"$use_colors\" -eq 1 ] && showme=1\n                ;;\n            3)\n                [ \"$STATUS\" -eq 0 ] && showme=1\n                ;;\n            9)\n                gotoxy $((COLUMNS - ${#txt})) 1\n                printf '%s\\n' \"$txt\"\n                ;;\n        esac\n        if [ $showme -eq 1 ]; then\n            printTitleCmd \"$cmd\" \"$txt\"\n        else\n            clearN $((${#txt} + 3))\n        fi\n    done\n\n    # 2nd line: grouping and or\n    if [ \"$STATUS\" -eq 0 ]; then\n        printf %s \"$_eol\"\n    else\n        if [ \"$STATUS\" -eq 1 ]; then\n            for i in 0 1 2; do\n                txt=${tit2_txt[$i]}\n                cmd=${tit2_cmd[$i]}\n                showme=1\n                [ $i -eq 2 ] && [ $GRP1 -eq $GRP2 ] && showme=0\n                if [ $showme -eq 1 ]; then\n                    printTitleCmd \"$cmd\" \"$txt\"\n                else\n                    clearN $((${#txt} + 3))\n                fi\n            done\n        else # delete commands only\n            clearN $((${#tit2_txt[0]} + 5 + ${#tit2_txt[1]} + 5 + ${#tit2_txt[2]} + 5))\n        fi\n\n        # open groups\n        gotoxy $((COLUMNS - GRP1 - GRP2 - ${#GRP1})) 2\n        color=\"$cP\"\n        [ \"$GRP1\" -eq \"$GRP2\" ] && color=\"$cB\"\n        for ((j = 0; j < GRP1; j++)); do printf '%s(%s' \"$color\" \"$cN\"; done\n        [ $GRP1 -gt 0 ] && printf %s \"$GRP1\"\n        for ((j = 0; j < GRP2; j++)); do printf '%s)%s' \"$color\" \"$cN\"; done\n    fi\n\n    # 3rd line: legend\n    txt=${tit2_txt[9]}\n    cmd=${tit2_cmd[9]}\n    gotoxy $((COLUMNS - ${#txt} - ${#cmd} - 1)) 3\n    if [ \"$has_not_supported\" -eq 1 ]; then\n        printf '%s%s%s %s' \"$cB\" \"$cmd\" \"$cN\" \"$txt\"\n    else\n        clearN $((${#txt} + ${#cmd} + 1))\n    fi\n}\n\ndoMenu() {\n    local i\n    local -a Menui\n\n    eval \"Menui=(\\\"\\${$1[@]}\\\")\"\n    menu_n=$((${#Menui[*]} - 1)) # ini (global var)\n\n    if [ \"$is_interactive\" -eq 1 ]; then\n\n        # history\n        gotoxy $x_hist $y_hist\n        printf '   %s.oO(%s%s%s)%s%s(%s%s%s)%s%s\\n' \\\n            \"$cP\" \"$cN\" \"$REPLIES\" \"$cP\" \"$cN\" \\\n            \"$cP\" \"$cN\" \"$uins\" \"$cP\" \"$cN\" \\\n            \"$_eol\"\n\n        # title\n        gotoxy $x_menu $y_menu\n        printf '%s%s:%s%s\\n' \"$cI\" \"${Menui[0]}\" \"$cN\" \"$_eol\"\n\n        # itens\n        for i in $(sek $menu_n); do\n            printf '  %s%d%s) %s%s\\n' \"$cB\" \"$i\" \"$cN\" \"${Menui[$i]}\" \"$_eol\"\n            i=$((i + 1))\n        done\n        clearEnd\n\n        # prompt\n        gotoxy $x_prompt $y_prompt\n        printf '%s[1-%d]:%s %s' \"$cP\" \"$menu_n\" \"$cN\" \"$_eol\"\n        read -r -n 1\n    else\n        doNextHist\n        REPLY=$hist\n    fi\n}\n\nMenu() {\n    local name=\"$1\"\n    local ok=0\n\n    while [ $ok -eq 0 ]; do\n        doMenu \"$name\"\n        case \"$REPLY\" in\n            [1-9])\n                [ \"$REPLY\" -gt \"$menu_n\" ] && continue\n                ok=1\n                REPLIES=\"$REPLIES$REPLY\"\n                ;;\n            .)\n                ok=1\n                LASTSTATUS=$STATUS\n                STATUS=3\n                ;;\n            0)\n                ok=1\n                STATUS=Z\n                ;;\n            \\*)\n                ColorOnOff\n                TopTitle\n                ;;\n            [\\(\\)\\|])\n                [ \"$STATUS\" -ne 1 ] && continue\n                [ \"$REPLY\" == ')' ] &&\n                    { [ $GRP1 -gt 0 ] && [ $GRP1 -eq $GRP2 ] || [ $GRP1 -eq 0 ]; } &&\n                    continue\n                [ \"$REPLY\" == ')' ] && STATUS=2\n                ok=1\n                REPLIES=\"$REPLIES$REPLY\"\n                ;;\n            /)\n                ok=1\n                STATUS=4\n                ;;\n        esac\n    done\n}\n\ndoNextHist() {\n    hists=${hists#?} # deleting previous item\n    hist=${hists:0:1}\n    : \"${hist:=.}\" # if last, quit\n}\n\ndoNextHistArg() {\n    histargs=${histargs#*¤}\n    histarg=${histargs%%¤*}\n}\n\ngetChar() {\n    gotoxy $x_prompt2 $y_prompt\n\n    if [ \"$is_interactive\" -eq 1 ]; then\n        printf '%s%s%s ' \"$cP\" $\"which one?\" \"$cN\"\n        read -n 1 -r USERINPUT\n        uin=\"$USERINPUT\"\n    else\n        doNextHistArg\n        uin=$histarg\n    fi\n\n    uins=\"${uins}¤$uin\"\n    F_ESCCHAR=1\n}\n\ngetCharList() {\n    gotoxy $x_prompt2 $y_prompt\n\n    if [ \"$is_interactive\" -eq 1 ]; then\n        printf '%s%s%s ' \"$cP\" $\"which?\" \"$cN\"\n        read -r USERINPUT\n        uin=\"$USERINPUT\"\n    else\n        doNextHistArg\n        uin=$histarg\n    fi\n\n    # dedup is safe because $uin contains only literal chars (no ranges)\n    uin=\"$(uniqChars \"$uin\")\"\n\n    uins=\"${uins}¤$uin\"\n\n    # putting not special chars in not special places: [][^-]\n    [ \"${uin#^}\" != \"$uin\" ] && uin=\"${uin#^}^\"    # move leading ^ to the end\n    [ \"${uin#?*-}\" != \"$uin\" ] && uin=\"${uin/-/}-\" # move non-leading - to the end\n    [ \"${uin/]/}\" != \"$uin\" ] && uin=\"]${uin/]/}\"  # move ] to the start\n\n    # if any $1, negated list\n    [ -n \"$1\" ] && uin=\"^$uin\"\n\n    # make it a list\n    uin=\"[$uin]\"\n    F_ESCCHARLIST=1\n}\n\ngetString() {\n    gotoxy $x_prompt2 $y_prompt\n\n    if [ \"$is_interactive\" -eq 1 ]; then\n        printf '%stxt:%s ' \"$cP\" \"$cN\"\n        read -r USERINPUT\n        uin=\"$USERINPUT\"\n    else\n        doNextHistArg\n        uin=$histarg\n    fi\n\n    uins=\"${uins}¤$uin\"\n    F_ESCCHAR=1\n}\n\ngetNumber() {\n    gotoxy $x_prompt2 $y_prompt\n\n    if [ \"$is_interactive\" -eq 1 ]; then\n        printf '%sN=%s%s' \"$cP\" \"$cN\" \"$_eol\"\n        read -r USERINPUT\n        uin=\"$USERINPUT\"\n    else\n        doNextHistArg\n        uin=$histarg\n    fi\n\n    # Remove !numbers\n    uin=\"${uin//[^0-9]/}\"\n\n    # ee\n    if [ \"${uin/666/x}\" == 'x' ]; then\n        gotoxy 36 1\n        printf '%s]:|%s\\n' \"$cP\" \"$cN\"\n    fi\n\n    if [ -n \"$uin\" ]; then\n        uins=\"${uins}¤$uin\"\n    else\n        getNumber # there _must_ be a number\n    fi\n}\n\ngetPosix() {\n    local psx\n    local rpl\n\n    unset SUBHUMAN\n\n    if [ \"$is_interactive\" -eq 1 ]; then\n        Choice --reset \"${posix_txt[@]}\"\n    else\n        ChoiceAuto\n    fi\n\n    for rpl in $CHOICEREPLY; do\n        psx=\"${psx}[:${posix_re[$rpl]}:]\"\n        SUBHUMAN=\"$SUBHUMAN, ${posix_txt[$rpl]/ (*)/}\"\n    done\n\n    SUBHUMAN=${SUBHUMAN#, }\n    F_POSIX=1\n\n    uin=\"[$psx]\"\n    uins=\"${uins}¤:${CHOICEREPLY// /}\"\n}\n\ngetCombo() {\n    local cmb\n    local rpl\n\n    unset SUBHUMAN\n\n    if [ \"$is_interactive\" -eq 1 ]; then\n        Choice --reset \"${combo_txt[@]}\"\n    else\n        ChoiceAuto\n    fi\n\n    for rpl in $CHOICEREPLY; do\n        cmb=\"$cmb${combo_re[$rpl]}\"\n        SUBHUMAN=\"$SUBHUMAN, ${combo_txt[$rpl]}\"\n    done\n\n    # In this menu, @ is used as a placeholder for the tab char\n    # It will have to be replaced later, so let's set the flag\n    charInText @ \"$cmb\" && F_GETTAB=1\n\n    SUBHUMAN=${SUBHUMAN#, }\n\n    uin=\"[$cmb]\"\n    uins=\"${uins}¤:${CHOICEREPLY// /}\"\n}\n\ngetREady() { #TODO\n    unset SUBHUMAN\n    uin=''\n}\n\n# convert [@] -> [\\t] or [<TAB>] based on ax_*[8] value\ngetListTab() {\n    local x\n\n    if [ \"$(getMeta \"ax_${progs[$1]}\" 8)\" == '\\t' ]; then\n        x='\\t'\n    else\n        x='<TAB>'\n    fi\n\n    uin=\"${uin/@/$x}\"\n}\n\n# Set $uin to !! when POSIX character classes are not supported\ngetHasPosix() {\n    [ \"$(getMeta \"ax_${progs[$1]}\" 7)\" == 'P' ] || uin='!!'\n}\n\n# Escape possible metachars in user input so they will be matched literally\nescChar() {\n    local index=\"$1\"\n\n    local escape_metachar\n    local special_chars\n\n    escape_metachar=$(getMeta \"ax_${progs[$index]}\" 4)\n    special_chars=$(getMeta \"ax_${progs[$index]}\" 5)\n\n    uin=$(escapeChars \"$special_chars\" \"$uin\" \"$escape_metachar\")\n}\n\n# Escape user input: maybe '\\' inside [] needs to be escaped\nescCharList() {\n    local escape_metachar\n\n    # shellcheck disable=SC1003\n    if [ \"$(getMeta \"ax_${progs[$1]}\" 6)\" == '\\' ]; then\n        escape_metachar=$(getMeta \"ax_${progs[$1]}\" 4)\n        if [[ ${BASH_VERSINFO[0]} -lt 5 ]]; then\n            uin=\"${uin/\\\\/$escape_metachar$escape_metachar}\"\n        else\n            uin=\"${uin/\\\\/\"$escape_metachar$escape_metachar\"}\"\n        fi\n    fi\n}\n\nReset() {\n    local p\n\n    # It's all global variables in this function\n    gotoxy $x_regex $y_regex\n    unset REPLIES uins HUMAN \"Regex[*]\"\n    has_not_supported=0\n    GRP1=0\n    GRP2=0\n\n    maxprogname=$(getLargestItem \"${progs[@]}\") # global var\n    for p in \"${progs[@]}\"; do\n        [ \"$is_interactive\" -eq 1 ] &&\n            printf \" Regex %-${#maxprogname}s: %s\\n\" \"$p\" \"$_eol\"\n    done\n}\n\nshowRegex() {\n    gotoxy $x_regex $y_regex\n\n    local i\n    local new_part\n    local save=\"$uin\"\n\n    # For each program\n    for ((i = 0; i < ${#progs[@]}; i++)); do\n        [ \"$F_ESCCHAR\" == 1 ] && escChar \"$i\"\n        [ \"$F_ESCCHARLIST\" == 1 ] && escCharList \"$i\"\n        [ \"$F_GETTAB\" == 1 ] && getListTab \"$i\"\n        [ \"$F_POSIX\" == 1 ] && getHasPosix \"$i\"\n\n        # Check status\n        case \"$1\" in\n            ax | S2)\n                eval new_part=\"\\${$1_${progs[$i]}[$REPLY]/@/$uin}\"\n                [ \"$new_part\" == '-' ] && new_part=''\n                Regex[$i]=\"${Regex[$i]}$new_part\"\n                [ \"$new_part\" == '!!' ] && has_not_supported=1\n                ;;\n            S0)\n                Regex[$i]=\"${Regex[$i]}${S0_re[$REPLY]}\"\n                ;;\n            S1)\n                Regex[$i]=\"${Regex[$i]}${uin:-${S1_re[$REPLY]}}\"\n\n                # When a program does not support POSIX character classes, $uin\n                # will be set to !! by getHasPosix(). Also check $REPLY to avoid\n                # a false positive when the user wants to match the !! string.\n                [ \"$REPLY\" -eq 7 ] && [ \"$uin\" == '!!' ] && has_not_supported=1\n                ;;\n        esac\n\n        [ \"$is_interactive\" -eq 1 ] &&\n            printf \" Regex %-${#maxprogname}s: %s\\n\" \"${progs[$i]}\" \"${Regex[$i]}\"\n        uin=\"$save\"\n    done\n    unset uin USERINPUT F_ESCCHAR F_ESCCHARLIST F_GETTAB F_POSIX\n}\n\n#\n### And now the cool-smart-MSclippy choice menu/prompt\n#\n# number of items <= 10, 1 column\n# number of items >  10, 2 columns\n# maximum number of items = 26 (a-z)\n#\n\n# Just refresh the selected item on the screen\nChoiceRefresh() {\n    local xy=$1\n    local a=$2\n    local stat=$3\n    local opt=$4\n\n    # colorizing case status is ON\n    [ \"$stat\" == '+' ] && stat=\"$cI$stat$cN\"\n\n    gotoxy \"${xy#*;}\" \"${xy%;*}\"\n    printf '  %s%s%s) %s%s ' \"$cB\" \"$a\" \"$cN\" \"$stat\" \"$opt\"\n}\n\n# --reset resets the stat array\nChoice() {\n    local choicereset=0\n    [ \"$1\" == '--reset' ] && shift && choicereset=1\n\n    local alf\n    local alpha\n    local cols\n    local i\n    local line\n    local lines\n    local numopts=$#\n    local op\n    local opt\n    local opts\n    local optxy\n    local rpl\n\n    alpha=(a b c d e f g h i j k l m n o p q r s t u v w x y z)\n\n    # Reading options and filling default status (off)\n    i=0\n    for opt in \"$@\"; do\n        opts[$i]=\"$opt\"\n        [ \"$choicereset\" -eq 1 ] && stat[$i]='-'\n        i=$((i + 1))\n    done\n\n    # Checking our number of items limit\n    [ \"$numopts\" -gt \"${#alpha[*]}\" ] &&\n        printError 'too much itens (>%d)' \"${#alpha[*]}\"\n\n    # The header\n    Clear\n    printTitleCmd '.' $\"exit\"\n    printf '| %s' $\"press the letters to (un)select the items\"\n\n    # We will need 2 columns?\n    cols=1\n    [ \"$numopts\" -gt 10 ] && cols=2\n\n    # And how much lines? (remember: odd number of items, requires one more line)\n    lines=$((numopts / cols))\n    [ \"$((numopts % cols))\" -eq 1 ] && lines=$((lines + 1))\n\n    # Filling the options screen's position array (+3 = header:2, sek:1)\n    for ((line = 0; line < lines; line++)); do\n        # Column 1\n        optxy[$line]=\"$((line + 3));1\"\n\n        # Column 2\n        [ \"$cols\" == 2 ] && optxy[$((line + lines))]=\"$((line + 3));40\"\n    done\n\n    # Showing initial status for all options\n    for ((op = 0; op < numopts; op++)); do\n        ChoiceRefresh \"${optxy[$op]}\" \"${alpha[$op]}\" \"${stat[$op]}\" \"${opts[$op]}\"\n    done\n\n    # And now the cool invisible prompt\n    while :; do\n        read -s -r -n 1 CHOICEREPLY\n\n        case \"$CHOICEREPLY\" in\n            [a-z])\n                # Inverting the option status\n                for ((alf = 0; alf < numopts; alf++)); do\n                    if [ \"${alpha[$alf]}\" == \"$CHOICEREPLY\" ]; then\n                        if [ \"${stat[$alf]}\" == '+' ]; then\n                            stat[$alf]='-'\n                        else\n                            stat[$alf]='+'\n                        fi\n                        break\n                    fi\n                done\n\n                # Showing the change\n                [ -z \"${opts[alf]}\" ] && continue\n                ChoiceRefresh \"${optxy[$alf]}\" \"${alpha[$alf]}\" \\\n                    \"${stat[$alf]}\" \"${opts[$alf]}\"\n                ;;\n            .)\n                # Getting the user choices and exiting\n                unset CHOICEREPLY\n                for ((rpl = 0; rpl < numopts; rpl++)); do\n                    [ \"${stat[$rpl]}\" == '+' ] && CHOICEREPLY=\"$CHOICEREPLY $rpl\"\n                done\n                break\n                ;;\n        esac\n    done\n}\n\n# Non-interative, just return the answers\nChoiceAuto() {\n    local i\n    local z\n\n    unset CHOICEREPLY\n    doNextHistArg\n    z=${histarg#:} # marker\n\n    for ((i = 0; i < ${#z}; i++)); do\n        CHOICEREPLY=\"$CHOICEREPLY ${z:$i:1}\"\n    done\n}\n\n# Fills the stat array with the actual active programs ON\nstatActiveProgs() {\n    local i\n    local p\n    local ps=\" ${progs[*]} \"\n\n    # For each program\n    for ((i = 0; i < ${#allprogs[@]}; i++)); do\n        # Default OFF\n        p=\"${allprogs[$i]}\"\n        stat[$i]='-'\n\n        # Case found, turn ON\n        [ \"${ps/ $p /}\" != \"$ps\" ] && stat[$i]='+'\n    done\n}\n\n###############################################################################\n######################### ariel, ucla, vamos! #################################\n###############################################################################\n\nSTATUS=0 # default status\nClear\nScreenSize\nColorOnOff # turning color ON\ntrap \"clearEnd; echo; exit\" SIGINT\n\nwhile :; do\n    case ${STATUS:=0} in\n        0 | Z)\n            STATUS=${STATUS/Z/0}\n            Reset\n            TopTitle\n            Menu S0_txt\n            [ -z \"${STATUS/[Z34]/}\" ] && continue # 0,3,4: escape status\n            HUMAN=\"${S0_txt[0]} ${S0_txt[$REPLY]}\"\n            showRegex S0\n            STATUS=1\n            ;;\n        1)\n            TopTitle\n            Menu S1_txt\n            [ -z \"${STATUS/[Z34]/}\" ] && continue # 0,3,4: escape status\n            if [ -n \"${REPLY/[1-9]/}\" ]; then\n                HUMAN=\"$HUMAN $REPLY\"\n                if [ \"$REPLY\" == '|' ]; then\n                    REPLY=1\n                elif [ \"$REPLY\" == '(' ]; then\n                    REPLY=2\n                    GRP1=$((GRP1 + 1))\n                elif [ \"$REPLY\" == ')' ]; then\n                    REPLY=3\n                    GRP2=$((GRP2 + 1))\n                else\n                    printf '\\n\\n'\n                    printError 'unknown reply type \"%s\"\\n' \"$REPLY\"\n                fi\n                showRegex ax\n            else\n                HUMAN=\"$HUMAN, ${S1_txt[0]} ${S1_txt[$REPLY]/ (*)/}\"\n                case \"$REPLY\" in\n                    1)\n                        STATUS=2\n                        ;;\n                    2)\n                        STATUS=2\n                        getChar\n                        ;;\n                    3)\n                        STATUS=1\n                        getString\n                        HUMAN=\"$HUMAN {$uin}\"\n                        ;;\n                    4)\n                        STATUS=2\n                        getCharList\n                        ;;\n                    5)\n                        STATUS=2\n                        getCharList negated\n                        ;;\n                    [678])\n                        STATUS=12\n                        continue\n                        ;;\n                    9)\n                        STATUS=1\n                        ;;\n                esac\n                showRegex S1\n            fi\n            ;;\n        12)\n            [ \"$REPLY\" -eq 6 ] && STATUS=2 && getCombo\n            [ \"$REPLY\" -eq 7 ] && STATUS=2 && getPosix\n            [ \"$REPLY\" -eq 8 ] && STATUS=1 && getREady\n            Clear\n            TopTitle\n            HUMAN=\"$HUMAN {$SUBHUMAN}\"\n            showRegex S1\n            ;;\n        2)\n            TopTitle\n            Menu S2_txt\n            [ -z \"${STATUS/[Z34]/}\" ] && continue # 0,3,4: escape status\n            rep_middle=$\"repeated\"\n            rep_txt=\"${S2_txt[$REPLY]}\"\n            rep_txtend=$\"times\"\n\n            [ \"$REPLY\" -ge 5 ] && getNumber && rep_txt=${rep_txt/N/$uin}\n            HUMAN=\"$HUMAN, $rep_middle ${rep_txt/ (*)/} $rep_txtend\"\n            showRegex S2\n            STATUS=1\n            ;;\n        3)\n            [ \"$is_interactive\" -eq 0 ] && STATUS=9 && continue\n            warning=$\"Really quit?\"\n            read -r -n 1 -p \"..$cB $warning [.] $cN\"\n            STATUS=$LASTSTATUS\n            [ \"$REPLY\" == '.' ] && STATUS=9\n            ;;\n        4)\n            statActiveProgs\n            Choice \"${allprogs[@]}\"\n            i=0\n            unset progs\n\n            # Rewriting the progs array with the user choices\n            for rpl in $CHOICEREPLY; do\n                progs[$i]=${allprogs[$rpl]}\n                i=$((i + 1))\n            done\n            ScreenSize\n            Clear\n            STATUS=0\n            ;;\n        9)\n            gotoxy $x_hist $y_hist\n            clearEnd\n            if [ \"$is_interactive\" -eq 1 ]; then\n                noregex_txt=$\"no regex\"\n                printf \"%stxt2regex --history '%s%s'%s\\n\\n\" \\\n                    \"$cB\" \"$REPLIES\" \"$uins\" \"$cN\"\n                printf '%s.\\n' \"${HUMAN:-$noregex_txt}\"\n            else\n                for ((i = 0; i < ${#progs[@]}; i++)); do # for each program\n                    printf \" Regex %-${#maxprogname}s: %s\\n\" \\\n                        \"${progs[$i]}\" \"${Regex[$i]}\"\n                done\n                printf '\\n'\n            fi\n            exit 0\n            ;;\n        *)\n            printError 'STATUS = \"%s\"\\n' \"$STATUS\"\n            ;;\n    esac\ndone\n"
  }
]