ripgrep-11.0.2/.gitignore010064400017500000144000000003141351372666500134640ustar0000000000000000.*.swp tags target /grep/Cargo.lock /globset/Cargo.lock /ignore/Cargo.lock /termcolor/Cargo.lock /wincolor/Cargo.lock /deployment # Snapcraft files stage prime parts *.snap *.pyc ripgrep*_source.tar.bz2 ripgrep-11.0.2/.travis.yml010064400017500000144000000072441351372666500136160ustar0000000000000000language: rust dist: xenial env: global: - PROJECT_NAME: ripgrep - RUST_BACKTRACE: full addons: apt: packages: # For generating man page. - libxslt1-dev - asciidoc - docbook-xsl - xsltproc - libxml2-utils # Needed for completion-function test. - zsh # Needed for testing decompression search. - xz-utils - liblz4-tool # For building MUSL static builds on Linux. - musl-tools matrix: fast_finish: true include: # Nightly channel. # All *nix releases are done on the nightly channel to take advantage # of the regex library's multiple pattern SIMD search. - os: linux rust: nightly env: TARGET=i686-unknown-linux-musl - os: linux rust: nightly env: TARGET=x86_64-unknown-linux-musl - os: osx rust: nightly # XML_CATALOG_FILES is apparently necessary for asciidoc on macOS. env: TARGET=x86_64-apple-darwin XML_CATALOG_FILES=/usr/local/etc/xml/catalog - os: linux rust: nightly env: TARGET=arm-unknown-linux-gnueabihf GCC_VERSION=4.8 addons: apt: packages: - gcc-4.8-arm-linux-gnueabihf - binutils-arm-linux-gnueabihf - libc6-armhf-cross - libc6-dev-armhf-cross # For generating man page. - libxslt1-dev - asciidoc - docbook-xsl - xsltproc - libxml2-utils # Beta channel. We enable these to make sure there are no regressions in # Rust beta releases. - os: linux rust: beta env: TARGET=x86_64-unknown-linux-musl - os: linux rust: beta env: TARGET=x86_64-unknown-linux-gnu # Minimum Rust supported channel. We enable these to make sure ripgrep # continues to work on the advertised minimum Rust version. - os: linux rust: 1.34.0 env: TARGET=x86_64-unknown-linux-gnu - os: linux rust: 1.34.0 env: TARGET=x86_64-unknown-linux-musl - os: linux rust: 1.34.0 env: TARGET=arm-unknown-linux-gnueabihf GCC_VERSION=4.8 addons: apt: packages: - gcc-4.8-arm-linux-gnueabihf - binutils-arm-linux-gnueabihf - libc6-armhf-cross - libc6-dev-armhf-cross # For generating man page. - libxslt1-dev - asciidoc - docbook-xsl - xsltproc - libxml2-utils install: ci/install.sh script: ci/script.sh before_deploy: ci/before_deploy.sh deploy: provider: releases file_glob: true file: deployment/${PROJECT_NAME}-${TRAVIS_TAG}-${TARGET}.tar.gz skip_cleanup: true on: condition: $TRAVIS_RUST_VERSION = nightly branch: master # i guess we do need this after all? tags: true api_key: secure: "IbSnsbGkxSydR/sozOf1/SRvHplzwRUHzcTjM7BKnr7GccL86gRPUrsrvD103KjQUGWIc1TnK1YTq5M0Onswg/ORDjqa1JEJPkPdPnVh9ipbF7M2De/7IlB4X4qXLKoApn8+bx2x/mfYXu4G+G1/2QdbaKK2yfXZKyjz0YFx+6CNrVCT2Nk8q7aHvOOzAL58vsG8iPDpupuhxlMDDn/UhyOWVInmPPQ0iJR1ZUJN8xJwXvKvBbfp3AhaBiAzkhXHNLgBR8QC5noWWMXnuVDMY3k4f3ic0V+p/qGUCN/nhptuceLxKFicMCYObSZeUzE5RAI0/OBW7l3z2iCoc+TbAnn+JrX/ObJCfzgAOXAU3tLaBFMiqQPGFKjKg1ltSYXomOFP/F7zALjpvFp4lYTBajRR+O3dqaxA9UQuRjw27vOeUpMcga4ZzL4VXFHzrxZKBHN//XIGjYAVhJ1NSSeGpeJV5/+jYzzWKfwSagRxQyVCzMooYFFXzn8Yxdm3PJlmp3GaAogNkdB9qKcrEvRINCelalzALPi0hD/HUDi8DD2PNTCLLMo6VSYtvc685Zbe+KgNzDV1YyTrRCUW6JotrS0r2ULLwnsh40hSB//nNv3XmwNmC/CmW5QAnIGj8cBMF4S2t6ohADIndojdAfNiptmaZOIT6owK7bWMgPMyopo=" branches: only: # Pushes and PR to the master branch - master # Ruby regex to match tags. Required, or travis won't trigger deploys when # a new tag is pushed. - /^\d+\.\d+\.\d+.*$/ notifications: email: on_success: never ripgrep-11.0.2/CHANGELOG.md010064400017500000144000001570221352065631600133070ustar000000000000000011.0.2 (2019-08-01) =================== ripgrep 11.0.2 is a new patch release that fixes a few bugs, including a performance regression and a matching bug when using the `-F/--fixed-strings` flag. Feature enhancements: * [FEATURE #1293](https://github.com/BurntSushi/ripgrep/issues/1293): Added `--glob-case-insensitive` flag that makes `--glob` behave as `--iglob`. Bug fixes: * [BUG #1246](https://github.com/BurntSushi/ripgrep/issues/1246): Add translations to README, starting with an unofficial Chinese translation. * [BUG #1259](https://github.com/BurntSushi/ripgrep/issues/1259): Fix bug where the last byte of a `-f file` was stripped if it wasn't a `\n`. * [BUG #1261](https://github.com/BurntSushi/ripgrep/issues/1261): Document that no error is reported when searching for `\n` with `-P/--pcre2`. * [BUG #1284](https://github.com/BurntSushi/ripgrep/issues/1284): Mention `.ignore` and `.rgignore` more prominently in the README. * [BUG #1292](https://github.com/BurntSushi/ripgrep/issues/1292): Fix bug where `--with-filename` was sometimes enabled incorrectly. * [BUG #1268](https://github.com/BurntSushi/ripgrep/issues/1268): Fix major performance regression in GitHub `x86_64-linux` binary release. * [BUG #1302](https://github.com/BurntSushi/ripgrep/issues/1302): Show better error messages when a non-existent preprocessor command is given. * [BUG #1334](https://github.com/BurntSushi/ripgrep/issues/1334): Fix match regression with `-F` flag when patterns contain meta characters. 11.0.1 (2019-04-16) =================== ripgrep 11.0.1 is a new patch release that fixes a search regression introduced in the previous 11.0.0 release. In particular, ripgrep can enter an infinite loop for some search patterns when searching invalid UTF-8. Bug fixes: * [BUG #1247](https://github.com/BurntSushi/ripgrep/issues/1247): Fix search bug that can cause ripgrep to enter an infinite loop. 11.0.0 (2019-04-15) =================== ripgrep 11 is a new major version release of ripgrep that contains many bug fixes, some performance improvements and a few feature enhancements. Notably, ripgrep's user experience for binary file filtering has been improved. See the [guide's new section on binary data](GUIDE.md#binary-data) for more details. This release also marks a change in ripgrep's versioning. Where as the previous version was `0.10.0`, this version is `11.0.0`. Moving forward, ripgrep's major version will be increased a few times per year. ripgrep will continue to be conservative with respect to backwards compatibility, but may occasionally introduce breaking changes, which will always be documented in this CHANGELOG. See [issue 1172](https://github.com/BurntSushi/ripgrep/issues/1172) for a bit more detail on why this versioning change was made. This release increases the **minimum supported Rust version** from 1.28.0 to 1.34.0. **BREAKING CHANGES**: * ripgrep has tweaked its exit status codes to be more like GNU grep's. Namely, if a non-fatal error occurs during a search, then ripgrep will now always emit a `2` exit status code, regardless of whether a match is found or not. Previously, ripgrep would only emit a `2` exit status code for a catastrophic error (e.g., regex syntax error). One exception to this is if ripgrep is run with `-q/--quiet`. In that case, if an error occurs and a match is found, then ripgrep will exit with a `0` exit status code. * Supplying the `-u/--unrestricted` flag three times is now equivalent to supplying `--no-ignore --hidden --binary`. Previously, `-uuu` was equivalent to `--no-ignore --hidden --text`. The difference is that `--binary` disables binary file filtering without potentially dumping binary data into your terminal. That is, `rg -uuu foo` should now be equivalent to `grep -r foo`. * The `avx-accel` feature of ripgrep has been removed since it is no longer necessary. All uses of AVX in ripgrep are now enabled automatically via runtime CPU feature detection. The `simd-accel` feature does remain available (only for enabling SIMD for transcoding), however, it does increase compilation times substantially at the moment. Performance improvements: * [PERF #497](https://github.com/BurntSushi/ripgrep/issues/497), [PERF #838](https://github.com/BurntSushi/ripgrep/issues/838): Make `rg -F -f dictionary-of-literals` much faster. Feature enhancements: * Added or improved file type filtering for Apache Thrift, ASP, Bazel, Brotli, BuildStream, bzip2, C, C++, Cython, gzip, Java, Make, Postscript, QML, Tex, XML, xz, zig and zstd. * [FEATURE #855](https://github.com/BurntSushi/ripgrep/issues/855): Add `--binary` flag for disabling binary file filtering. * [FEATURE #1078](https://github.com/BurntSushi/ripgrep/pull/1078): Add `--max-columns-preview` flag for showing a preview of long lines. * [FEATURE #1099](https://github.com/BurntSushi/ripgrep/pull/1099): Add support for Brotli and Zstd to the `-z/--search-zip` flag. * [FEATURE #1138](https://github.com/BurntSushi/ripgrep/pull/1138): Add `--no-ignore-dot` flag for ignoring `.ignore` files. * [FEATURE #1155](https://github.com/BurntSushi/ripgrep/pull/1155): Add `--auto-hybrid-regex` flag for automatically falling back to PCRE2. * [FEATURE #1159](https://github.com/BurntSushi/ripgrep/pull/1159): ripgrep's exit status logic should now match GNU grep. See updated man page. * [FEATURE #1164](https://github.com/BurntSushi/ripgrep/pull/1164): Add `--ignore-file-case-insensitive` for case insensitive ignore globs. * [FEATURE #1185](https://github.com/BurntSushi/ripgrep/pull/1185): Add `-I` flag as a short option for the `--no-filename` flag. * [FEATURE #1207](https://github.com/BurntSushi/ripgrep/pull/1207): Add `none` value to `-E/--encoding` to forcefully disable all transcoding. * [FEATURE da9d7204](https://github.com/BurntSushi/ripgrep/commit/da9d7204): Add `--pcre2-version` for querying showing PCRE2 version information. Bug fixes: * [BUG #306](https://github.com/BurntSushi/ripgrep/issues/306), [BUG #855](https://github.com/BurntSushi/ripgrep/issues/855): Improve the user experience for ripgrep's binary file filtering. * [BUG #373](https://github.com/BurntSushi/ripgrep/issues/373), [BUG #1098](https://github.com/BurntSushi/ripgrep/issues/1098): `**` is now accepted as valid syntax anywhere in a glob. * [BUG #916](https://github.com/BurntSushi/ripgrep/issues/916): ripgrep no longer hangs when searching `/proc` with a zombie process present. * [BUG #1052](https://github.com/BurntSushi/ripgrep/issues/1052): Fix bug where ripgrep could panic when transcoding UTF-16 files. * [BUG #1055](https://github.com/BurntSushi/ripgrep/issues/1055): Suggest `-U/--multiline` when a pattern contains a `\n`. * [BUG #1063](https://github.com/BurntSushi/ripgrep/issues/1063): Always strip a BOM if it's present, even for UTF-8. * [BUG #1064](https://github.com/BurntSushi/ripgrep/issues/1064): Fix inner literal detection that could lead to incorrect matches. * [BUG #1079](https://github.com/BurntSushi/ripgrep/issues/1079): Fixes a bug where the order of globs could result in missing a match. * [BUG #1089](https://github.com/BurntSushi/ripgrep/issues/1089): Fix another bug where ripgrep could panic when transcoding UTF-16 files. * [BUG #1091](https://github.com/BurntSushi/ripgrep/issues/1091): Add note about inverted flags to the man page. * [BUG #1093](https://github.com/BurntSushi/ripgrep/pull/1093): Fix handling of literal slashes in gitignore patterns. * [BUG #1095](https://github.com/BurntSushi/ripgrep/issues/1095): Fix corner cases involving the `--crlf` flag. * [BUG #1101](https://github.com/BurntSushi/ripgrep/issues/1101): Fix AsciiDoc escaping for man page output. * [BUG #1103](https://github.com/BurntSushi/ripgrep/issues/1103): Clarify what `--encoding auto` does. * [BUG #1106](https://github.com/BurntSushi/ripgrep/issues/1106): `--files-with-matches` and `--files-without-match` work with one file. * [BUG #1121](https://github.com/BurntSushi/ripgrep/issues/1121): Fix bug that was triggering Windows antimalware when using the `--files` flag. * [BUG #1125](https://github.com/BurntSushi/ripgrep/issues/1125), [BUG #1159](https://github.com/BurntSushi/ripgrep/issues/1159): ripgrep shouldn't panic for `rg -h | rg` and should emit correct exit status. * [BUG #1144](https://github.com/BurntSushi/ripgrep/issues/1144): Fixes a bug where line numbers could be wrong on big-endian machines. * [BUG #1154](https://github.com/BurntSushi/ripgrep/issues/1154): Windows files with "hidden" attribute are now treated as hidden. * [BUG #1173](https://github.com/BurntSushi/ripgrep/issues/1173): Fix handling of `**` patterns in gitignore files. * [BUG #1174](https://github.com/BurntSushi/ripgrep/issues/1174): Fix handling of repeated `**` patterns in gitignore files. * [BUG #1176](https://github.com/BurntSushi/ripgrep/issues/1176): Fix bug where `-F`/`-x` weren't applied to patterns given via `-f`. * [BUG #1189](https://github.com/BurntSushi/ripgrep/issues/1189): Document cases where ripgrep may use a lot of memory. * [BUG #1203](https://github.com/BurntSushi/ripgrep/issues/1203): Fix a matching bug related to the suffix literal optimization. * [BUG 8f14cb18](https://github.com/BurntSushi/ripgrep/commit/8f14cb18): Increase the default stack size for PCRE2's JIT. 0.10.0 (2018-09-07) =================== This is a new minor version release of ripgrep that contains some major new features, a huge number of bug fixes, and is the first release based on libripgrep. The entirety of ripgrep's core search and printing code has been rewritten and generalized so that anyone can make use of it. Major new features include PCRE2 support, multi-line search and a JSON output format. **BREAKING CHANGES**: * The minimum version required to compile Rust has now changed to track the latest stable version of Rust. Patch releases will continue to compile with the same version of Rust as the previous patch release, but new minor versions will use the current stable version of the Rust compile as its minimum supported version. * The match semantics of `-w/--word-regexp` have changed slightly. They used to be `\b(?:)\b`, but now it's `(?:^|\W)(?:)(?:$|\W)`. This matches the behavior of GNU grep and is believed to be closer to the intended semantics of the flag. See [#389](https://github.com/BurntSushi/ripgrep/issues/389) for more details. Feature enhancements: * [FEATURE #162](https://github.com/BurntSushi/ripgrep/issues/162): libripgrep is now a thing. The primary crate is [`grep`](https://docs.rs/grep). * [FEATURE #176](https://github.com/BurntSushi/ripgrep/issues/176): Add `-U/--multiline` flag that permits matching over multiple lines. * [FEATURE #188](https://github.com/BurntSushi/ripgrep/issues/188): Add `-P/--pcre2` flag that gives support for look-around and backreferences. * [FEATURE #244](https://github.com/BurntSushi/ripgrep/issues/244): Add `--json` flag that prints results in a JSON Lines format. * [FEATURE #321](https://github.com/BurntSushi/ripgrep/issues/321): Add `--one-file-system` flag to skip directories on different file systems. * [FEATURE #404](https://github.com/BurntSushi/ripgrep/issues/404): Add `--sort` and `--sortr` flag for more sorting. Deprecate `--sort-files`. * [FEATURE #416](https://github.com/BurntSushi/ripgrep/issues/416): Add `--crlf` flag to permit `$` to work with carriage returns on Windows. * [FEATURE #917](https://github.com/BurntSushi/ripgrep/issues/917): The `--trim` flag strips prefix whitespace from all lines printed. * [FEATURE #993](https://github.com/BurntSushi/ripgrep/issues/993): Add `--null-data` flag, which makes ripgrep use NUL as a line terminator. * [FEATURE #997](https://github.com/BurntSushi/ripgrep/issues/997): The `--passthru` flag now works with the `--replace` flag. * [FEATURE #1038-1](https://github.com/BurntSushi/ripgrep/issues/1038): Add `--line-buffered` and `--block-buffered` for forcing a buffer strategy. * [FEATURE #1038-2](https://github.com/BurntSushi/ripgrep/issues/1038): Add `--pre-glob` for filtering files through the `--pre` flag. Bug fixes: * [BUG #2](https://github.com/BurntSushi/ripgrep/issues/2): Searching with non-zero context can now use memory maps if appropriate. * [BUG #200](https://github.com/BurntSushi/ripgrep/issues/200): ripgrep will now stop correctly when its output pipe is closed. * [BUG #389](https://github.com/BurntSushi/ripgrep/issues/389): The `-w/--word-regexp` flag now works more intuitively. * [BUG #643](https://github.com/BurntSushi/ripgrep/issues/643): Detection of readable stdin has improved on Windows. * [BUG #441](https://github.com/BurntSushi/ripgrep/issues/441), [BUG #690](https://github.com/BurntSushi/ripgrep/issues/690), [BUG #980](https://github.com/BurntSushi/ripgrep/issues/980): Matching empty lines now works correctly in several corner cases. * [BUG #764](https://github.com/BurntSushi/ripgrep/issues/764): Color escape sequences now coalesce, which reduces output size. * [BUG #842](https://github.com/BurntSushi/ripgrep/issues/842): Add man page to binary Debian package. * [BUG #922](https://github.com/BurntSushi/ripgrep/issues/922): ripgrep is now more robust with respect to memory maps failing. * [BUG #937](https://github.com/BurntSushi/ripgrep/issues/937): Color escape sequences are no longer emitted for empty matches. * [BUG #940](https://github.com/BurntSushi/ripgrep/issues/940): Context from the `--passthru` flag should not impact process exit status. * [BUG #984](https://github.com/BurntSushi/ripgrep/issues/984): Fixes bug in `ignore` crate where first path was always treated as a symlink. * [BUG #990](https://github.com/BurntSushi/ripgrep/issues/990): Read stderr asynchronously when running a process. * [BUG #1013](https://github.com/BurntSushi/ripgrep/issues/1013): Add compile time and runtime CPU features to `--version` output. * [BUG #1028](https://github.com/BurntSushi/ripgrep/pull/1028): Don't complete bare pattern after `-f` in zsh. 0.9.0 (2018-08-03) ================== This is a new minor version release of ripgrep that contains some minor new features and a panoply of bug fixes. Releases provided on Github for `x86_64` will now work on all target CPUs, and will also automatically take advantage of features found on modern CPUs (such as AVX2) for additional optimizations. This release increases the **minimum supported Rust version** from 1.20.0 to 1.23.0. It is anticipated that the next release of ripgrep (0.10.0) will provide multi-line search support and a JSON output format. **BREAKING CHANGES**: * When `--count` and `--only-matching` are provided simultaneously, the behavior of ripgrep is as if the `--count-matches` flag was given. That is, the total number of matches is reported, where there may be multiple matches per line. Previously, the behavior of ripgrep was to report the total number of matching lines. (Note that this behavior diverges from the behavior of GNU grep.) * Octal syntax is no longer supported. ripgrep previously accepted expressions like `\1` as syntax for matching `U+0001`, but ripgrep will now report an error instead. * The `--line-number-width` flag has been removed. Its functionality was not carefully considered with all ripgrep output formats. See [#795](https://github.com/BurntSushi/ripgrep/issues/795) for more details. Feature enhancements: * Added or improved file type filtering for Android, Bazel, Fuchsia, Haskell, Java and Puppet. * [FEATURE #411](https://github.com/BurntSushi/ripgrep/issues/411): Add a `--stats` flag, which emits aggregate statistics after search results. * [FEATURE #646](https://github.com/BurntSushi/ripgrep/issues/646): Add a `--no-ignore-messages` flag, which suppresses parse errors from reading `.ignore` and `.gitignore` files. * [FEATURE #702](https://github.com/BurntSushi/ripgrep/issues/702): Support `\u{..}` Unicode escape sequences. * [FEATURE #812](https://github.com/BurntSushi/ripgrep/issues/812): Add `-b/--byte-offset` flag that shows the byte offset of each matching line. * [FEATURE #814](https://github.com/BurntSushi/ripgrep/issues/814): Add `--count-matches` flag, which is like `--count`, but for each match. * [FEATURE #880](https://github.com/BurntSushi/ripgrep/issues/880): Add a `--no-column` flag, which disables column numbers in the output. * [FEATURE #898](https://github.com/BurntSushi/ripgrep/issues/898): Add support for `lz4` when using the `-z/--search-zip` flag. * [FEATURE #924](https://github.com/BurntSushi/ripgrep/issues/924): `termcolor` has moved to its own repository: https://github.com/BurntSushi/termcolor * [FEATURE #934](https://github.com/BurntSushi/ripgrep/issues/934): Add a new flag, `--no-ignore-global`, that permits disabling global gitignores. * [FEATURE #967](https://github.com/BurntSushi/ripgrep/issues/967): Rename `--maxdepth` to `--max-depth` for consistency. Keep `--maxdepth` for backwards compatibility. * [FEATURE #978](https://github.com/BurntSushi/ripgrep/issues/978): Add a `--pre` option to filter inputs with an arbitrary program. * [FEATURE fca9709d](https://github.com/BurntSushi/ripgrep/commit/fca9709d): Improve zsh completion. Bug fixes: * [BUG #135](https://github.com/BurntSushi/ripgrep/issues/135): Release portable binaries that conditionally use SSSE3, AVX2, etc., at runtime. * [BUG #268](https://github.com/BurntSushi/ripgrep/issues/268): Print descriptive error message when trying to use look-around or backreferences. * [BUG #395](https://github.com/BurntSushi/ripgrep/issues/395): Show comprehensible error messages for regexes like `\s*{`. * [BUG #526](https://github.com/BurntSushi/ripgrep/issues/526): Support backslash escapes in globs. * [BUG #795](https://github.com/BurntSushi/ripgrep/issues/795): Fix problems with `--line-number-width` by removing it. * [BUG #832](https://github.com/BurntSushi/ripgrep/issues/832): Clarify usage instructions for `-f/--file` flag. * [BUG #835](https://github.com/BurntSushi/ripgrep/issues/835): Fix small performance regression while crawling very large directory trees. * [BUG #851](https://github.com/BurntSushi/ripgrep/issues/851): Fix `-S/--smart-case` detection once and for all. * [BUG #852](https://github.com/BurntSushi/ripgrep/issues/852): Be robust with respect to `ENOMEM` errors returned by `mmap`. * [BUG #853](https://github.com/BurntSushi/ripgrep/issues/853): Upgrade `grep` crate to `regex-syntax 0.6.0`. * [BUG #893](https://github.com/BurntSushi/ripgrep/issues/893): Improve support for git submodules. * [BUG #900](https://github.com/BurntSushi/ripgrep/issues/900): When no patterns are given, ripgrep should never match anything. * [BUG #907](https://github.com/BurntSushi/ripgrep/issues/907): ripgrep will now stop traversing after the first file when `--quiet --files` is used. * [BUG #918](https://github.com/BurntSushi/ripgrep/issues/918): Don't skip tar archives when `-z/--search-zip` is used. * [BUG #934](https://github.com/BurntSushi/ripgrep/issues/934): Don't respect gitignore files when searching outside git repositories. * [BUG #948](https://github.com/BurntSushi/ripgrep/issues/948): Use exit code 2 to indicate error, and use exit code 1 to indicate no matches. * [BUG #951](https://github.com/BurntSushi/ripgrep/issues/951): Add stdin example to ripgrep usage documentation. * [BUG #955](https://github.com/BurntSushi/ripgrep/issues/955): Use buffered writing when not printing to a tty, which fixes a performance regression. * [BUG #957](https://github.com/BurntSushi/ripgrep/issues/957): Improve the error message shown for `--path separator /` in some Windows shells. * [BUG #964](https://github.com/BurntSushi/ripgrep/issues/964): Add a `--no-fixed-strings` flag to disable `-F/--fixed-strings`. * [BUG #988](https://github.com/BurntSushi/ripgrep/issues/988): Fix a bug in the `ignore` crate that prevented the use of explicit ignore files after disabling all other ignore rules. * [BUG #995](https://github.com/BurntSushi/ripgrep/issues/995): Respect `$XDG_CONFIG_DIR/git/config` for detecting `core.excludesFile`. 0.8.1 (2018-02-20) ================== This is a patch release of ripgrep that primarily fixes regressions introduced in 0.8.0 (#820 and #824) in directory traversal on Windows. These regressions do not impact non-Windows users. Feature enhancements: * Added or improved file type filtering for csv and VHDL. * [FEATURE #798](https://github.com/BurntSushi/ripgrep/issues/798): Add `underline` support to `termcolor` and ripgrep. See documentation on the `--colors` flag for details. Bug fixes: * [BUG #684](https://github.com/BurntSushi/ripgrep/issues/684): Improve documentation for the `--ignore-file` flag. * [BUG #789](https://github.com/BurntSushi/ripgrep/issues/789): Don't show `(rev )` if the revision wasn't available during the build. * [BUG #791](https://github.com/BurntSushi/ripgrep/issues/791): Add man page to ARM release. * [BUG #797](https://github.com/BurntSushi/ripgrep/issues/797): Improve documentation for "intense" setting in `termcolor`. * [BUG #800](https://github.com/BurntSushi/ripgrep/issues/800): Fix a bug in the `ignore` crate for custom ignore files. This had no impact on ripgrep. * [BUG #807](https://github.com/BurntSushi/ripgrep/issues/807): Fix a bug where `rg --hidden .` behaved differently from `rg --hidden ./`. * [BUG #815](https://github.com/BurntSushi/ripgrep/issues/815): Clarify a common failure mode in user guide. * [BUG #820](https://github.com/BurntSushi/ripgrep/issues/820): Fixes a bug on Windows where symlinks were followed even if not requested. * [BUG #824](https://github.com/BurntSushi/ripgrep/issues/824): Fix a performance regression in directory traversal on Windows. 0.8.0 (2018-02-11) ================== This is a new minor version releae of ripgrep that satisfies several popular feature requests (config files, search compressed files, true colors), fixes many bugs and improves the quality of life for ripgrep maintainers. This release also includes greatly improved documentation in the form of a [User Guide](GUIDE.md) and a [FAQ](FAQ.md). This release increases the **minimum supported Rust version** from 1.17 to 1.20. **BREAKING CHANGES**: Note that these are all very minor and unlikely to impact most users. * In order to support configuration files, flag overrides needed to be rethought. In some cases, this changed ripgrep's behavior. For example, in ripgrep 0.7.1, `rg foo -s -i` will perform a case sensitive search since the `-s/--case-sensitive` flag was defined to always take precedence over the `-i/--ignore-case` flag, regardless of position. In ripgrep 0.8.0 however, the override rule for all flags has changed to "the most recent flag wins among competing flags." That is, `rg foo -s -i` now performs a case insensitive search. * The `-M/--max-columns` flag was tweaked so that specifying a value of `0` now makes ripgrep behave as if the flag was absent. This makes it possible to set a default value in a configuration file and then override it. The previous ripgrep behavior was to suppress all matching non-empty lines. * In all globs, `[^...]` is now equivalent to `[!...]` (indicating class negation). Previously, `^` had no special significance in a character class. * For **downstream packagers**, the directory hierarchy in ripgrep's archive releases has changed. The root directory now only contains the executable, README and license. There is now a new directory called `doc` which contains the man page (previously in the root), a user guide (new), a FAQ (new) and the CHANGELOG (previously not included in release). The `complete` directory remains the same. Feature enhancements: * Added or improved file type filtering for Apache Avro, C++, GN, Google Closure Templates, Jupyter notebooks, man pages, Protocol Buffers, Smarty and Web IDL. * [FEATURE #196](https://github.com/BurntSushi/ripgrep/issues/196): Support a configuration file. See [the new user guide](GUIDE.md#configuration-file) for details. * [FEATURE #261](https://github.com/BurntSushi/ripgrep/issues/261): Add extended or "true" color support. Works in Windows 10! [See the FAQ for details.](FAQ.md#colors) * [FEATURE #539](https://github.com/BurntSushi/ripgrep/issues/539): Search gzip, bzip2, lzma or xz files when given `-z/--search-zip` flag. * [FEATURE #544](https://github.com/BurntSushi/ripgrep/issues/544): Add support for line number alignment via a new `--line-number-width` flag. * [FEATURE #654](https://github.com/BurntSushi/ripgrep/pull/654): Support linuxbrew in ripgrep's Brew tap. * [FEATURE #673](https://github.com/BurntSushi/ripgrep/issues/673): Bring back `.rgignore` files. (A higher precedent, application specific version of `.ignore`.) * [FEATURE #676](https://github.com/BurntSushi/ripgrep/issues/676): Provide ARM binaries. **WARNING:** This will be provided on a best effort basis. * [FEATURE #709](https://github.com/BurntSushi/ripgrep/issues/709): Suggest `-F/--fixed-strings` flag on a regex syntax error. * [FEATURE #740](https://github.com/BurntSushi/ripgrep/issues/740): Add a `--passthru` flag that causes ripgrep to print every line it reads. * [FEATURE #785](https://github.com/BurntSushi/ripgrep/pull/785): Overhaul documentation. Cleaned up README, added user guide and FAQ. * [FEATURE 7f5c07](https://github.com/BurntSushi/ripgrep/commit/7f5c07434be92103b5bf7e216b9c7494aed2d8cb): Add hidden flags for convenient overrides (e.g., `--no-text`). Bug fixes: * [BUG #553](https://github.com/BurntSushi/ripgrep/issues/553): Permit flags to be repeated. * [BUG #633](https://github.com/BurntSushi/ripgrep/issues/633): Fix a bug where ripgrep would panic on Windows while following symlinks. * [BUG #649](https://github.com/BurntSushi/ripgrep/issues/649): Fix handling of `!**/` in `.gitignore`. * [BUG #663](https://github.com/BurntSushi/ripgrep/issues/663): **BREAKING CHANGE:** Support `[^...]` glob syntax (as identical to `[!...]`). * [BUG #693](https://github.com/BurntSushi/ripgrep/issues/693): Don't display context separators when not printing matches. * [BUG #705](https://github.com/BurntSushi/ripgrep/issues/705): Fix a bug that prevented ripgrep from searching OneDrive directories. * [BUG #717](https://github.com/BurntSushi/ripgrep/issues/717): Improve `--smart-case` uppercase character detection. * [BUG #725](https://github.com/BurntSushi/ripgrep/issues/725): Clarify that globs do not override explicitly given paths to search. * [BUG #742](https://github.com/BurntSushi/ripgrep/pull/742): Write ANSI reset code as `\x1B[0m` instead of `\x1B[m`. * [BUG #747](https://github.com/BurntSushi/ripgrep/issues/747): Remove `yarn.lock` from YAML file type. * [BUG #760](https://github.com/BurntSushi/ripgrep/issues/760): ripgrep can now search `/sys/devices/system/cpu/vulnerabilities/*` files. * [BUG #761](https://github.com/BurntSushi/ripgrep/issues/761): Fix handling of gitignore patterns that contain a `/`. * [BUG #776](https://github.com/BurntSushi/ripgrep/pull/776): **BREAKING CHANGE:** `--max-columns=0` now disables the limit. * [BUG #779](https://github.com/BurntSushi/ripgrep/issues/779): Clarify documentation for `--files-without-match`. * [BUG #780](https://github.com/BurntSushi/ripgrep/issues/780), [BUG #781](https://github.com/BurntSushi/ripgrep/issues/781): Fix bug where ripgrep missed some matching lines. Maintenance fixes: * [MAINT #772](https://github.com/BurntSushi/ripgrep/pull/772): Drop `env_logger` in favor of simpler logger to avoid many new dependencies. * [MAINT #772](https://github.com/BurntSushi/ripgrep/pull/772): Add git revision hash to ripgrep's version string. * [MAINT #772](https://github.com/BurntSushi/ripgrep/pull/772): (Seemingly) improve compile times. * [MAINT #776](https://github.com/BurntSushi/ripgrep/pull/776): Automatically generate man page during build. * [MAINT #786](https://github.com/BurntSushi/ripgrep/pull/786): Remove use of `unsafe` in `globset`. :tada: * [MAINT e9d448](https://github.com/BurntSushi/ripgrep/commit/e9d448e93bb4e1fb3b0c1afc29adb5af6ed5283d): Add an issue template (has already drastically improved bug reports). * [MAINT ae2d03](https://github.com/BurntSushi/ripgrep/commit/ae2d036dd4ba2a46acac9c2d77c32e7c667eb850): Remove the `compile` script. Friends of ripgrep: I'd like to extend my gratitude to [@balajisivaraman](https://github.com/balajisivaraman) for their recent hard work in a number of areas, and in particular, for implementing the "search compressed files" feature. Their work in sketching out a specification for that and other work has been exemplary. Thanks [@balajisivaraman](https://github.com/balajisivaraman)! 0.7.1 (2017-10-22) ================== This is a patch release of ripgrep that includes a fix to very bad regression introduced in ripgrep 0.7.0. Bug fixes: * [BUG #648](https://github.com/BurntSushi/ripgrep/issues/648): Fix a bug where it was very easy to exceed standard file descriptor limits. 0.7.0 (2017-10-20) ================== This is a new minor version release of ripgrep that includes mostly bug fixes. ripgrep continues to require Rust 1.17, and there are no known breaking changes introduced in this release. Feature enhancements: * Added or improved file type filtering for config & license files, Elm, Purescript, Standard ML, sh, systemd, Terraform * [FEATURE #593](https://github.com/BurntSushi/ripgrep/pull/593): Using both `-o/--only-matching` and `-r/--replace` does the right thing. Bug fixes: * [BUG #200](https://github.com/BurntSushi/ripgrep/issues/200): ripgrep will stop when its pipe is closed. * [BUG #402](https://github.com/BurntSushi/ripgrep/issues/402): Fix context printing bug when the `-m/--max-count` flag is used. * [BUG #521](https://github.com/BurntSushi/ripgrep/issues/521): Fix interaction between `-r/--replace` and terminal colors. * [BUG #559](https://github.com/BurntSushi/ripgrep/issues/559): Ignore test that tried reading a non-UTF-8 file path on macOS. * [BUG #599](https://github.com/BurntSushi/ripgrep/issues/599): Fix color escapes on empty matches. * [BUG #600](https://github.com/BurntSushi/ripgrep/issues/600): Avoid expensive (on Windows) file handle check when using --files. * [BUG #618](https://github.com/BurntSushi/ripgrep/issues/618): Clarify installation instructions for Ubuntu users. * [BUG #633](https://github.com/BurntSushi/ripgrep/issues/633): Faster symlink loop checking on Windows. 0.6.0 (2017-08-23) ================== This is a new minor version release of ripgrep that includes many bug fixes and a few new features such as `--iglob` and `-x/--line-regexp`. Note that this release increases the minimum supported Rust version from 1.12 to 1.17. Feature enhancements: * Added or improved file type filtering for BitBake, C++, Cabal, cshtml, Julia, Make, msbuild, QMake, Yocto * [FEATURE #163](https://github.com/BurntSushi/ripgrep/issues/163): Add an `--iglob` flag that is like `-g/--glob`, but matches globs case insensitively. * [FEATURE #520](https://github.com/BurntSushi/ripgrep/pull/518): Add `-x/--line-regexp` flag, which requires a match to span an entire line. * [FEATURE #551](https://github.com/BurntSushi/ripgrep/pull/551), [FEATURE #554](https://github.com/BurntSushi/ripgrep/pull/554): `ignore`: add new `matched_path_or_any_parents` method. Bug fixes: * [BUG #342](https://github.com/BurntSushi/ripgrep/issues/342): Fix invisible text in some PowerShell environments by changing the default color scheme on Windows. * [BUG #413](https://github.com/BurntSushi/ripgrep/issues/413): Release binaries on Unix are now `strip`'d by default. This decreases binary size by an order of magnitude. * [BUG #483](https://github.com/BurntSushi/ripgrep/issues/483): When `--quiet` is passed, `--files` should be quiet. * [BUG #488](https://github.com/BurntSushi/ripgrep/pull/488): When `--vimgrep` is passed, `--with-filename` should be enabled automatically. * [BUG #493](https://github.com/BurntSushi/ripgrep/issues/493): Fix another bug in the implementation of the `-o/--only-matching` flag. * [BUG #499](https://github.com/BurntSushi/ripgrep/pull/499): Permit certain flags to override others. * [BUG #523](https://github.com/BurntSushi/ripgrep/pull/523): `wincolor`: Re-fetch Windows console on all calls. * [BUG #523](https://github.com/BurntSushi/ripgrep/issues/524): `--version` now shows enabled compile-time features. * [BUG #532](https://github.com/BurntSushi/ripgrep/issues/532), [BUG #536](https://github.com/BurntSushi/ripgrep/pull/536), [BUG #538](https://github.com/BurntSushi/ripgrep/pull/538), [BUG #540](https://github.com/BurntSushi/ripgrep/pull/540), [BUG #560](https://github.com/BurntSushi/ripgrep/pull/560), [BUG #565](https://github.com/BurntSushi/ripgrep/pull/565): Improve zsh completion. * [BUG #578](https://github.com/BurntSushi/ripgrep/pull/578): Enable SIMD for `encoding_rs` when appropriate. * [BUG #580](https://github.com/BurntSushi/ripgrep/issues/580): Fix `-w/--word-regexp` in the presence of capturing groups. * [BUG #581](https://github.com/BurntSushi/ripgrep/issues/581): Document that ripgrep may terminate unexpectedly when searching via memory maps (which can happen using default settings). Friends of ripgrep: I'd like to give a big Thank You to @okdana for their recent hard work on ripgrep. This includes new features like `--line-regexp`, heroic effort on zsh auto-completion and thinking through some thorny argv issues with me. I'd also like to thank @ericbn for their work on improving ripgrep's argv parsing by allowing some flags to override others. Thanks @okdana and @ericbn! 0.5.2 (2017-05-11) ================== Feature enhancements: * Added or improved file type filtering for Nix. * [FEATURE #362](https://github.com/BurntSushi/ripgrep/issues/362): Add `--regex-size-limit` and `--dfa-size-limit` flags. * [FEATURE #444](https://github.com/BurntSushi/ripgrep/issues/444): Improve error messages for invalid globs. Bug fixes: * [BUG #442](https://github.com/BurntSushi/ripgrep/issues/442): Fix line wrapping in `--help` output. * [BUG #451](https://github.com/BurntSushi/ripgrep/issues/451): Fix bug with duplicate output when using `-o/--only-matching` flag. 0.5.1 (2017-04-09) ================== Feature enhancements: * Added or improved file type filtering for vim. * [FEATURE #34](https://github.com/BurntSushi/ripgrep/issues/34): Add a `-o/--only-matching` flag. * [FEATURE #377](https://github.com/BurntSushi/ripgrep/issues/377): Column numbers can now be customized with a color. (The default is no color.) * [FEATURE #419](https://github.com/BurntSushi/ripgrep/issues/419): Added `-0` short flag option for `--null`. Bug fixes: * [BUG #381](https://github.com/BurntSushi/ripgrep/issues/381): Include license text in all subcrates. * [BUG #418](https://github.com/BurntSushi/ripgrep/issues/418), [BUG #426](https://github.com/BurntSushi/ripgrep/issues/426), [BUG #439](https://github.com/BurntSushi/ripgrep/issues/439): Fix a few bugs with `-h/--help` output. 0.5.0 (2017-03-12) ================== This is a new minor version release of ripgrep that includes one minor breaking change, bug fixes and several new features including support for text encodings other than UTF-8. A notable accomplishment with respect to Rust is that ripgrep proper now only contains a single `unsafe` use (for accessing the contents of a memory map). The **breaking change** is: * [FEATURE #380](https://github.com/BurntSushi/ripgrep/issues/380): Line numbers are now hidden by default when ripgrep is printing to a tty **and** the only thing searched is stdin. Feature enhancements: * Added or improved file type filtering for Ceylon, CSS, Elixir, HTML, log, SASS, SVG, Twig * [FEATURE #1](https://github.com/BurntSushi/ripgrep/issues/1): Add support for additional text encodings, including automatic detection for UTF-16 via BOM sniffing. Explicit text encoding support with the `-E/--encoding` flag was also added for latin-1, GBK, EUC-JP and Shift_JIS, among others. The full list can be found here: https://encoding.spec.whatwg.org/#concept-encoding-get * [FEATURE #129](https://github.com/BurntSushi/ripgrep/issues/129): Add a new `-M/--max-columns` flag that omits lines longer than the given number of bytes. (Disabled by default!) * [FEATURE #369](https://github.com/BurntSushi/ripgrep/issues/369): A new flag, `--max-filesize`, was added for limiting searches to files with a maximum file size. Bug fixes: * [BUG #52](https://github.com/BurntSushi/ripgrep/issues/52), [BUG #311](https://github.com/BurntSushi/ripgrep/issues/311): Tweak how binary files are detected and handled. (We are slightly less conservative and will no longer use memory without bound.) * [BUG #326](https://github.com/BurntSushi/ripgrep/issues/326): When --files flag is given, we should never attempt to parse positional arguments as regexes. * [BUG #327](https://github.com/BurntSushi/ripgrep/issues/327): Permit the --heading flag to override the --no-heading flag. * [BUG #340](https://github.com/BurntSushi/ripgrep/pull/340): Clarify that the `-u/--unrestricted` flags are aliases. * [BUG #343](https://github.com/BurntSushi/ripgrep/pull/343): Global git ignore config should use `$HOME/.config/git/ignore` and not `$HOME/git/ignore`. * [BUG #345](https://github.com/BurntSushi/ripgrep/pull/345): Clarify docs for `-g/--glob` flag. * [BUG #381](https://github.com/BurntSushi/ripgrep/issues/381): Add license files to each sub-crate. * [BUG #383](https://github.com/BurntSushi/ripgrep/issues/383): Use latest version of clap (for argv parsing). * [BUG #392](https://github.com/BurntSushi/ripgrep/issues/391): Fix translation of set globs (e.g., `{foo,bar,quux}`) to regexes. * [BUG #401](https://github.com/BurntSushi/ripgrep/pull/401): Add PowerShell completion file to Windows release. * [BUG #405](https://github.com/BurntSushi/ripgrep/issues/405): Fix bug when excluding absolute paths with the `-g/--glob` flag. 0.4.0 ===== This is a new minor version release of ripgrep that includes a couple very minor breaking changes, a few new features and lots of bug fixes. This version of ripgrep upgrades its `regex` dependency from `0.1` to `0.2`, which includes a few minor syntax changes: * POSIX character classes now require double bracketing. Previously, the regex `[:upper:]` would parse as the `upper` POSIX character class. Now it parses as the character class containing the characters `:upper:`. The fix to this change is to use `[[:upper:]]` instead. Note that variants like `[[:upper:][:blank:]]` continue to work. * The character `[` must always be escaped inside a character class. * The characters `&`, `-` and `~` must be escaped if any one of them are repeated consecutively. For example, `[&]`, `[\&]`, `[\&\&]`, `[&-&]` are all equivalent while `[&&]` is illegal. (The motivation for this and the prior change is to provide a backwards compatible path for adding character class set notation.) Feature enhancements: * Added or improved file type filtering for Crystal, Kotlin, Perl, PowerShell, Ruby, Swig * [FEATURE #83](https://github.com/BurntSushi/ripgrep/issues/83): Type definitions can now include other type definitions. * [FEATURE #243](https://github.com/BurntSushi/ripgrep/issues/243): **BREAKING CHANGE**: The `--column` flag now implies `--line-number`. * [FEATURE #263](https://github.com/BurntSushi/ripgrep/issues/263): Add a new `--sort-files` flag. * [FEATURE #275](https://github.com/BurntSushi/ripgrep/issues/275): Add a new `--path-separator` flag. Useful in cygwin. Bug fixes: * [BUG #182](https://github.com/BurntSushi/ripgrep/issues/182): Redux: use more portable ANSI color escape sequences when possible. * [BUG #258](https://github.com/BurntSushi/ripgrep/issues/258): Fix bug that caused ripgrep's parallel iterator to spin and burn CPU. * [BUG #262](https://github.com/BurntSushi/ripgrep/issues/262): Document how to install shell completion files. * [BUG #266](https://github.com/BurntSushi/ripgrep/issues/266), [BUG #293](https://github.com/BurntSushi/ripgrep/issues/293): Fix handling of bold styling and change the default colors. * [BUG #268](https://github.com/BurntSushi/ripgrep/issues/268): Make lack of backreference support more explicit. * [BUG #271](https://github.com/BurntSushi/ripgrep/issues/271): Remove `~` dependency on clap. * [BUG #277](https://github.com/BurntSushi/ripgrep/issues/277): Fix cosmetic issue in `globset` crate docs. * [BUG #279](https://github.com/BurntSushi/ripgrep/issues/279): ripgrep did not terminate when `-q/--quiet` was given. * [BUG #281](https://github.com/BurntSushi/ripgrep/issues/281): **BREAKING CHANGE**: Completely remove `^C` handling from ripgrep. * [BUG #284](https://github.com/BurntSushi/ripgrep/issues/284): Make docs for `-g/--glob` clearer. * [BUG #286](https://github.com/BurntSushi/ripgrep/pull/286): When stdout is redirected to a file, don't search that file. * [BUG #287](https://github.com/BurntSushi/ripgrep/pull/287): Fix ZSH completions. * [BUG #295](https://github.com/BurntSushi/ripgrep/pull/295): Remove superfluous `memmap` dependency in `grep` crate. * [BUG #308](https://github.com/BurntSushi/ripgrep/pull/308): Improve docs for `-r/--replace`. * [BUG #313](https://github.com/BurntSushi/ripgrep/pull/313): Update bytecount dep to latest version. * [BUG #318](https://github.com/BurntSushi/ripgrep/pull/318): Fix invalid UTF-8 output bug in Windows consoles. 0.3.2 ===== Feature enhancements: * Added or improved file type filtering for Less, Sass, stylus, Zsh Bug fixes: * [BUG #229](https://github.com/BurntSushi/ripgrep/issues/229): Make smart case slightly less conservative. * [BUG #247](https://github.com/BurntSushi/ripgrep/issues/247): Clarify use of --heading/--no-heading. * [BUG #251](https://github.com/BurntSushi/ripgrep/issues/251), [BUG #264](https://github.com/BurntSushi/ripgrep/issues/264), [BUG #267](https://github.com/BurntSushi/ripgrep/issues/267): Fix matching bug caused by literal optimizations. * [BUG #256](https://github.com/BurntSushi/ripgrep/issues/256): Fix bug that caused `rg foo` and `rg foo/` to have different behavior when `foo` was a symlink. * [BUG #270](https://github.com/BurntSushi/ripgrep/issues/270): Fix bug where patterns starting with a `-` couldn't be used with the `-e/--regexp` flag. (This resolves a regression that was introduced in ripgrep 0.3.0.) 0.3.1 ===== Bug fixes: * [BUG #242](https://github.com/BurntSushi/ripgrep/issues/242): ripgrep didn't respect `--colors foo:none` correctly. Now it does. 0.3.0 ===== This is a new minor version release of ripgrep that includes two breaking changes with lots of bug fixes and some new features and performance improvements. Notably, if you had a problem with colors or piping on Windows before, then that should now be fixed in this release. **BREAKING CHANGES**: * ripgrep now requires Rust 1.11 to compile. Previously, it could build on Rust 1.9. The cause of this was the move from [Docopt to Clap](https://github.com/BurntSushi/ripgrep/pull/233) for argument parsing. * The `-e/--regexp` flag can no longer accept a pattern starting with a `-`. There are two work-arounds: `rg -- -foo` and `rg [-]foo` or `rg -e [-]foo` will all search for the same `-foo` pattern. The cause of this was the move from [Docopt to Clap](https://github.com/BurntSushi/ripgrep/pull/233) for argument parsing. [This may get fixed in the future.](https://github.com/kbknapp/clap-rs/issues/742). Performance improvements: * [PERF #33](https://github.com/BurntSushi/ripgrep/issues/33): ripgrep now performs similar to GNU grep on small corpora. * [PERF #136](https://github.com/BurntSushi/ripgrep/issues/136): ripgrep no longer slows down because of argument parsing when given a large argument list. Feature enhancements: * Added or improved file type filtering for Elixir. * [FEATURE #7](https://github.com/BurntSushi/ripgrep/issues/7): Add a `-f/--file` flag that causes ripgrep to read patterns from a file. * [FEATURE #51](https://github.com/BurntSushi/ripgrep/issues/51): Add a `--colors` flag that enables one to customize the colors used in ripgrep's output. * [FEATURE #138](https://github.com/BurntSushi/ripgrep/issues/138): Add a `--files-without-match` flag that shows only file paths that contain zero matches. * [FEATURE #230](https://github.com/BurntSushi/ripgrep/issues/230): Add completion files to the release (Bash, Fish and PowerShell). Bug fixes: * [BUG #37](https://github.com/BurntSushi/ripgrep/issues/37): Use correct ANSI escape sequences when `TERM=screen.linux`. * [BUG #94](https://github.com/BurntSushi/ripgrep/issues/94): ripgrep now detects stdin on Windows automatically. * [BUG #117](https://github.com/BurntSushi/ripgrep/issues/117): Colors should now work correctly and automatically inside mintty. * [BUG #182](https://github.com/BurntSushi/ripgrep/issues/182): Colors should now work within Emacs. In particular, `--color=always` will emit colors regardless of the current environment. * [BUG #189](https://github.com/BurntSushi/ripgrep/issues/189): Show less content when running `rg -h`. The full help content can be accessed with `rg --help`. * [BUG #210](https://github.com/BurntSushi/ripgrep/issues/210): Support non-UTF-8 file names on Unix platforms. * [BUG #231](https://github.com/BurntSushi/ripgrep/issues/231): Switch from block buffering to line buffering. * [BUG #241](https://github.com/BurntSushi/ripgrep/issues/241): Some error messages weren't suppressed when `--no-messages` was used. 0.2.9 ===== Bug fixes: * [BUG #226](https://github.com/BurntSushi/ripgrep/issues/226): File paths explicitly given on the command line weren't searched in parallel. (This was a regression in `0.2.7`.) * [BUG #228](https://github.com/BurntSushi/ripgrep/issues/228): If a directory was given to `--ignore-file`, ripgrep's memory usage would grow without bound. 0.2.8 ===== Bug fixes: * Fixed a bug with the SIMD/AVX features for using bytecount in commit `4ca15a`. 0.2.7 ===== Performance improvements: * [PERF #223](https://github.com/BurntSushi/ripgrep/pull/223): Added a parallel recursive directory iterator. This results in major performance improvements on large repositories. * [PERF #11](https://github.com/BurntSushi/ripgrep/pull/11): ripgrep now uses the `bytecount` library for counting new lines. In some cases, ripgrep runs twice as fast. Use `RUSTFLAGS="-C target-cpu=native" cargo build --release --features 'simd-accel avx-accel'` to get the fastest possible binary. Feature enhancements: * Added or improved file type filtering for Agda, Tex, Taskpaper, Markdown, asciidoc, textile, rdoc, org, creole, wiki, pod, C#, PDF, C, C++. * [FEATURE #149](https://github.com/BurntSushi/ripgrep/issues/149): Add a new `--no-messages` flag that suppresses error messages. Note that `rg foo 2> /dev/null` also works. * [FEATURE #159](https://github.com/BurntSushi/ripgrep/issues/159): Add a new `-m/--max-count` flag that limits the total number of matches printed for each file searched. Bug fixes: * [BUG #199](https://github.com/BurntSushi/ripgrep/issues/199): Fixed a bug where `-S/--smart-case` wasn't being applied correctly to literal optimizations. * [BUG #203](https://github.com/BurntSushi/ripgrep/issues/203): Mention the full name, ripgrep, in more places. It now appears in the output of `--help` and `--version`. The repository URL is now also in the output of `--help` and the man page. * [BUG #215](https://github.com/BurntSushi/ripgrep/issues/215): Include small note about how to search for a pattern that starts with a `-`. 0.2.6 ===== Feature enhancements: * Added or improved file type filtering for Fish. Bug fixes: * [BUG #206](https://github.com/BurntSushi/ripgrep/issues/206): Fixed a regression with `-g/--glob` flag in `0.2.5`. 0.2.5 ===== Feature enhancements: * Added or improved file type filtering for Groovy, Handlebars, Tcl, zsh and Python. * [FEATURE #9](https://github.com/BurntSushi/ripgrep/issues/9): Support global gitignore config and `.git/info/exclude` files. * [FEATURE #45](https://github.com/BurntSushi/ripgrep/issues/45): Add --ignore-file flag for specifying additional ignore files. * [FEATURE #202](https://github.com/BurntSushi/ripgrep/pull/202): Introduce a new [`ignore`](https://github.com/BurntSushi/ripgrep/tree/master/ignore) crate that encapsulates all of ripgrep's gitignore matching logic. Bug fixes: * [BUG #44](https://github.com/BurntSushi/ripgrep/issues/44): ripgrep runs slowly when given lots of positional arguments that are directories. * [BUG #119](https://github.com/BurntSushi/ripgrep/issues/119): ripgrep didn't reset terminal colors if it was interrupted by `^C`. Fixed in [PR #187](https://github.com/BurntSushi/ripgrep/pull/187). * [BUG #184](https://github.com/BurntSushi/ripgrep/issues/184): Fixed a bug related to interpreting gitignore files in parent directories. 0.2.4 ===== SKIPPED. 0.2.3 ===== Bug fixes: * [BUG #164](https://github.com/BurntSushi/ripgrep/issues/164): Fixes a segfault on macos builds. * [BUG #167](https://github.com/BurntSushi/ripgrep/issues/167): Clarify documentation for --threads. 0.2.2 ===== Packaging updates: * `ripgrep` is now in homebrew-core. `brew install ripgrep` will do the trick on a Mac. * `ripgrep` is now in the Archlinux community repository. `pacman -S ripgrep` will do the trick on Archlinux. * Support has been discontinued for i686-darwin. * Glob matching has been moved out into its own crate: [`globset`](https://crates.io/crates/globset). Feature enhancements: * Added or improved file type filtering for CMake, config, Jinja, Markdown, Spark. * [FEATURE #109](https://github.com/BurntSushi/ripgrep/issues/109): Add a --max-depth flag for directory traversal. * [FEATURE #124](https://github.com/BurntSushi/ripgrep/issues/124): Add -s/--case-sensitive flag. Overrides --smart-case. * [FEATURE #139](https://github.com/BurntSushi/ripgrep/pull/139): The `ripgrep` repo is now a Homebrew tap. This is useful for installing SIMD accelerated binaries, which aren't available in homebrew-core. Bug fixes: * [BUG #87](https://github.com/BurntSushi/ripgrep/issues/87), [BUG #127](https://github.com/BurntSushi/ripgrep/issues/127), [BUG #131](https://github.com/BurntSushi/ripgrep/issues/131): Various issues related to glob matching. * [BUG #116](https://github.com/BurntSushi/ripgrep/issues/116): --quiet should stop search after first match. * [BUG #121](https://github.com/BurntSushi/ripgrep/pull/121): --color always should show colors, even when --vimgrep is used. * [BUG #122](https://github.com/BurntSushi/ripgrep/pull/122): Colorize file path at beginning of line. * [BUG #134](https://github.com/BurntSushi/ripgrep/issues/134): Processing a large ignore file (thousands of globs) was very slow. * [BUG #137](https://github.com/BurntSushi/ripgrep/issues/137): Always follow symlinks when given as an explicit argument. * [BUG #147](https://github.com/BurntSushi/ripgrep/issues/147): Clarify documentation for --replace. 0.2.1 ===== Feature enhancements: * Added or improved file type filtering for Clojure and SystemVerilog. * [FEATURE #89](https://github.com/BurntSushi/ripgrep/issues/89): Add a --null flag that outputs a NUL byte after every file path. Bug fixes: * [BUG #98](https://github.com/BurntSushi/ripgrep/issues/98): Fix a bug in single threaded mode when if opening a file failed, ripgrep quit instead of continuing the search. * [BUG #99](https://github.com/BurntSushi/ripgrep/issues/99): Fix another bug in single threaded mode where empty lines were being printed by mistake. * [BUG #105](https://github.com/BurntSushi/ripgrep/issues/105): Fix an off-by-one error with --column. * [BUG #106](https://github.com/BurntSushi/ripgrep/issues/106): Fix a bug where a whitespace only line in a gitignore file caused ripgrep to panic (i.e., crash). 0.2.0 ===== Feature enhancements: * Added or improved file type filtering for VB, R, F#, Swift, Nim, Javascript, TypeScript * [FEATURE #20](https://github.com/BurntSushi/ripgrep/issues/20): Adds a --no-filename flag. * [FEATURE #26](https://github.com/BurntSushi/ripgrep/issues/26): Adds --files-with-matches flag. Like --count, but only prints file paths and doesn't need to count every match. * [FEATURE #40](https://github.com/BurntSushi/ripgrep/issues/40): Switch from using `.rgignore` to `.ignore`. Note that `.rgignore` is still supported, but deprecated. * [FEATURE #68](https://github.com/BurntSushi/ripgrep/issues/68): Add --no-ignore-vcs flag that ignores .gitignore but not .ignore. * [FEATURE #70](https://github.com/BurntSushi/ripgrep/issues/70): Add -S/--smart-case flag (but is disabled by default). * [FEATURE #80](https://github.com/BurntSushi/ripgrep/issues/80): Add support for `{foo,bar}` globs. Many many bug fixes. Thanks every for reporting these and helping make `ripgrep` better! (Note that I haven't captured every tracking issue here, some were closed as duplicates.) * [BUG #8](https://github.com/BurntSushi/ripgrep/issues/8): Don't use an intermediate buffer when --threads=1. (Permits constant memory usage.) * [BUG #15](https://github.com/BurntSushi/ripgrep/issues/15): Improves the documentation for --type-add. * [BUG #16](https://github.com/BurntSushi/ripgrep/issues/16), [BUG #49](https://github.com/BurntSushi/ripgrep/issues/49), [BUG #50](https://github.com/BurntSushi/ripgrep/issues/50), [BUG #65](https://github.com/BurntSushi/ripgrep/issues/65): Some gitignore globs were being treated as anchored when they weren't. * [BUG #18](https://github.com/BurntSushi/ripgrep/issues/18): --vimgrep reported incorrect column number. * [BUG #19](https://github.com/BurntSushi/ripgrep/issues/19): ripgrep was hanging waiting on stdin in some Windows terminals. Note that this introduced a new bug: [#94](https://github.com/BurntSushi/ripgrep/issues/94). * [BUG #21](https://github.com/BurntSushi/ripgrep/issues/21): Removes leading `./` when printing file paths. * [BUG #22](https://github.com/BurntSushi/ripgrep/issues/22): Running `rg --help | echo` caused `rg` to panic. * [BUG #24](https://github.com/BurntSushi/ripgrep/issues/22): Clarify the central purpose of rg in its usage message. * [BUG #25](https://github.com/BurntSushi/ripgrep/issues/25): Anchored gitignore globs weren't applied in subdirectories correctly. * [BUG #30](https://github.com/BurntSushi/ripgrep/issues/30): Globs like `foo/**` should match contents of `foo`, but not `foo` itself. * [BUG #35](https://github.com/BurntSushi/ripgrep/issues/35), [BUG #81](https://github.com/BurntSushi/ripgrep/issues/81): When automatically detecting stdin, only read if it's a file or a fifo. i.e., ignore stdin in `rg foo < /dev/null`. * [BUG #36](https://github.com/BurntSushi/ripgrep/issues/36): Don't automatically pick memory maps on MacOS. Ever. * [BUG #38](https://github.com/BurntSushi/ripgrep/issues/38): Trailing whitespace in gitignore wasn't being ignored. * [BUG #43](https://github.com/BurntSushi/ripgrep/issues/43): --glob didn't work with directories. * [BUG #46](https://github.com/BurntSushi/ripgrep/issues/46): Use one fewer worker thread than what is provided on CLI. * [BUG #47](https://github.com/BurntSushi/ripgrep/issues/47): --help/--version now work even if other options are set. * [BUG #55](https://github.com/BurntSushi/ripgrep/issues/55): ripgrep was refusing to search /proc/cpuinfo. Fixed by disabling memory maps for files with zero size. * [BUG #64](https://github.com/BurntSushi/ripgrep/issues/64): The first path given with --files set was ignored. * [BUG #67](https://github.com/BurntSushi/ripgrep/issues/67): Sometimes whitelist globs like `!/dir` weren't interpreted as anchored. * [BUG #77](https://github.com/BurntSushi/ripgrep/issues/77): When -q/--quiet flag was passed, ripgrep kept searching even after a match was found. * [BUG #90](https://github.com/BurntSushi/ripgrep/issues/90): Permit whitelisting hidden files. * [BUG #93](https://github.com/BurntSushi/ripgrep/issues/93): ripgrep was extracting an erroneous inner literal from a repeated pattern. ripgrep-11.0.2/COPYING010064400017500000144000000001761274016737500125330ustar0000000000000000This project is dual-licensed under the Unlicense and MIT licenses. You may use this code under the terms of either license. ripgrep-11.0.2/Cargo.toml.orig010064400017500000144000000060551352066052400143600ustar0000000000000000[package] name = "ripgrep" version = "11.0.2" #:version authors = ["Andrew Gallant "] description = """ ripgrep is a line-oriented search tool that recursively searches your current directory for a regex pattern while respecting your gitignore rules. ripgrep has first class support on Windows, macOS and Linux. """ documentation = "https://github.com/BurntSushi/ripgrep" homepage = "https://github.com/BurntSushi/ripgrep" repository = "https://github.com/BurntSushi/ripgrep" readme = "README.md" keywords = ["regex", "grep", "egrep", "search", "pattern"] categories = ["command-line-utilities", "text-processing"] license = "Unlicense OR MIT" exclude = ["HomebrewFormula"] build = "build.rs" autotests = false edition = "2018" [badges] travis-ci = { repository = "BurntSushi/ripgrep" } appveyor = { repository = "BurntSushi/ripgrep" } [[bin]] bench = false path = "src/main.rs" name = "rg" [[test]] name = "integration" path = "tests/tests.rs" [workspace] members = [ "globset", "grep", "grep-cli", "grep-matcher", "grep-pcre2", "grep-printer", "grep-regex", "grep-searcher", "ignore", ] [dependencies] bstr = "0.2.0" grep = { version = "0.2.4", path = "grep" } ignore = { version = "0.4.7", path = "ignore" } lazy_static = "1.1.0" log = "0.4.5" num_cpus = "1.8.0" regex = "1.0.5" serde_json = "1.0.23" termcolor = "1.0.3" [dependencies.clap] version = "2.32.0" default-features = false features = ["suggestions"] [target.'cfg(all(target_env = "musl", target_pointer_width = "64"))'.dependencies.jemallocator] version = "0.3.0" [build-dependencies] lazy_static = "1.1.0" [build-dependencies.clap] version = "2.32.0" default-features = false features = ["suggestions"] [dev-dependencies] serde = "1.0.77" serde_derive = "1.0.77" [features] simd-accel = ["grep/simd-accel"] pcre2 = ["grep/pcre2"] [profile.release] debug = 1 [package.metadata.deb] features = ["pcre2"] section = "utils" assets = [ ["target/release/rg", "usr/bin/", "755"], ["COPYING", "usr/share/doc/ripgrep/", "644"], ["LICENSE-MIT", "usr/share/doc/ripgrep/", "644"], ["UNLICENSE", "usr/share/doc/ripgrep/", "644"], ["CHANGELOG.md", "usr/share/doc/ripgrep/CHANGELOG", "644"], ["README.md", "usr/share/doc/ripgrep/README", "644"], ["FAQ.md", "usr/share/doc/ripgrep/FAQ", "644"], # The man page is automatically generated by ripgrep's build process, so # this file isn't actually commited. Instead, to create a dpkg, either # create a deployment/deb directory and copy the man page to it, or use the # 'ci/build_deb.sh' script. ["deployment/deb/rg.1", "usr/share/man/man1/rg.1", "644"], # Similarly for shell completions. ["deployment/deb/rg.bash", "usr/share/bash-completion/completions/rg", "644"], ["deployment/deb/rg.fish", "usr/share/fish/completions/rg.fish", "644"], ["deployment/deb/_rg", "usr/share/zsh/vendor-completions/", "644"], ] extended-description = """\ ripgrep (rg) recursively searches your current directory for a regex pattern. By default, ripgrep will respect your .gitignore and automatically skip hidden files/directories and binary files. """ ripgrep-11.0.2/Cargo.toml0000644000000063740000000000000106340ustar00# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies # # If you believe there's an error in this file please file an # issue against the rust-lang/cargo repository. If you're # editing this file be aware that the upstream Cargo.toml # will likely look very different (and much more reasonable) [package] edition = "2018" name = "ripgrep" version = "11.0.2" authors = ["Andrew Gallant "] build = "build.rs" exclude = ["HomebrewFormula"] autotests = false description = "ripgrep is a line-oriented search tool that recursively searches your current\ndirectory for a regex pattern while respecting your gitignore rules. ripgrep\nhas first class support on Windows, macOS and Linux.\n" homepage = "https://github.com/BurntSushi/ripgrep" documentation = "https://github.com/BurntSushi/ripgrep" readme = "README.md" keywords = ["regex", "grep", "egrep", "search", "pattern"] categories = ["command-line-utilities", "text-processing"] license = "Unlicense OR MIT" repository = "https://github.com/BurntSushi/ripgrep" [package.metadata.deb] assets = [["target/release/rg", "usr/bin/", "755"], ["COPYING", "usr/share/doc/ripgrep/", "644"], ["LICENSE-MIT", "usr/share/doc/ripgrep/", "644"], ["UNLICENSE", "usr/share/doc/ripgrep/", "644"], ["CHANGELOG.md", "usr/share/doc/ripgrep/CHANGELOG", "644"], ["README.md", "usr/share/doc/ripgrep/README", "644"], ["FAQ.md", "usr/share/doc/ripgrep/FAQ", "644"], ["deployment/deb/rg.1", "usr/share/man/man1/rg.1", "644"], ["deployment/deb/rg.bash", "usr/share/bash-completion/completions/rg", "644"], ["deployment/deb/rg.fish", "usr/share/fish/completions/rg.fish", "644"], ["deployment/deb/_rg", "usr/share/zsh/vendor-completions/", "644"]] extended-description = "ripgrep (rg) recursively searches your current directory for a regex pattern.\nBy default, ripgrep will respect your .gitignore and automatically skip hidden\nfiles/directories and binary files.\n" features = ["pcre2"] section = "utils" [profile.release] debug = 1 [[bin]] name = "rg" path = "src/main.rs" bench = false [[test]] name = "integration" path = "tests/tests.rs" [dependencies.bstr] version = "0.2.0" [dependencies.clap] version = "2.32.0" features = ["suggestions"] default-features = false [dependencies.grep] version = "0.2.4" [dependencies.ignore] version = "0.4.7" [dependencies.lazy_static] version = "1.1.0" [dependencies.log] version = "0.4.5" [dependencies.num_cpus] version = "1.8.0" [dependencies.regex] version = "1.0.5" [dependencies.serde_json] version = "1.0.23" [dependencies.termcolor] version = "1.0.3" [dev-dependencies.serde] version = "1.0.77" [dev-dependencies.serde_derive] version = "1.0.77" [build-dependencies.clap] version = "2.32.0" features = ["suggestions"] default-features = false [build-dependencies.lazy_static] version = "1.1.0" [features] pcre2 = ["grep/pcre2"] simd-accel = ["grep/simd-accel"] [target."cfg(all(target_env = \"musl\", target_pointer_width = \"64\"))".dependencies.jemallocator] version = "0.3.0" [badges.appveyor] repository = "BurntSushi/ripgrep" [badges.travis-ci] repository = "BurntSushi/ripgrep" ripgrep-11.0.2/Cross.toml010064400017500000144000000001321352066516200134500ustar0000000000000000[target.x86_64-unknown-linux-musl] image = "burntsushi/x86_64-unknown-linux-musl:v0.1.14" ripgrep-11.0.2/FAQ.md010064400017500000144000001163711351372666500124400ustar0000000000000000## FAQ * [Does ripgrep support configuration files?](#config) * [What's changed in ripgrep recently?](#changelog) * [When is the next release?](#release) * [Does ripgrep have a man page?](#manpage) * [Does ripgrep have support for shell auto-completion?](#complete) * [How do I use lookaround and/or backreferences?](#fancy) * [How do I configure ripgrep's colors?](#colors) * [How do I enable true colors on Windows?](#truecolors-windows) * [How do I stop ripgrep from messing up colors when I kill it?](#stop-ripgrep) * [How can I get results in a consistent order?](#order) * [How do I search files that aren't UTF-8?](#encoding) * [How do I search compressed files?](#compressed) * [How do I search over multiple lines?](#multiline) * [How do I get around the regex size limit?](#size-limit) * [How do I make the `-f/--file` flag faster?](#dfa-size) * [How do I make the output look like The Silver Searcher's output?](#silver-searcher-output) * [Why does ripgrep get slower when I enabled PCRE2 regexes?](#pcre2-slow) * [When I run `rg`, why does it execute some other command?](#rg-other-cmd) * [How do I create an alias for ripgrep on Windows?](#rg-alias-windows) * [How do I create a PowerShell profile?](#powershell-profile) * [How do I pipe non-ASCII content to ripgrep on Windows?](#pipe-non-ascii-windows) * [How can I search and replace with ripgrep?](#search-and-replace) * [How is ripgrep licensed?](#license) * [Can ripgrep replace grep?](#posix4ever) * [What does the "rip" in ripgrep mean?](#intentcountsforsomething)

Does ripgrep support configuration files?

Yes. See the [guide's section on configuration files](GUIDE.md#configuration-file).

What's changed in ripgrep recently?

Please consult ripgrep's [CHANGELOG](CHANGELOG.md).

When is the next release?

ripgrep is a project whose contributors are volunteers. A release schedule adds undue stress to said volunteers. Therefore, releases are made on a best effort basis and no dates **will ever be given**. One exception to this is high impact bugs. If a ripgrep release contains a significant regression, then there will generally be a strong push to get a patch release out with a fix.

Does ripgrep have a man page?

Yes! Whenever ripgrep is compiled on a system with `asciidoc` present, then a man page is generated from ripgrep's argv parser. After compiling ripgrep, you can find the man page like so from the root of the repository: ``` $ find ./target -name rg.1 -print0 | xargs -0 ls -t | head -n1 ./target/debug/build/ripgrep-79899d0edd4129ca/out/rg.1 ``` Running `man -l ./target/debug/build/ripgrep-79899d0edd4129ca/out/rg.1` will show the man page in your normal pager. Note that the man page's documentation for options is equivalent to the output shown in `rg --help`. To see more condensed documentation (one line per flag), run `rg -h`. The man page is also included in all [ripgrep binary releases](https://github.com/BurntSushi/ripgrep/releases).

Does ripgrep have support for shell auto-completion?

Yes! Shell completions can be found in the [same directory as the man page](#manpage) after building ripgrep. Zsh completions are maintained separately and committed to the repository in `complete/_rg`. Shell completions are also included in all [ripgrep binary releases](https://github.com/BurntSushi/ripgrep/releases). For **bash**, move `rg.bash` to `$XDG_CONFIG_HOME/bash_completion` or `/etc/bash_completion.d/`. For **fish**, move `rg.fish` to `$HOME/.config/fish/completions/`. For **zsh**, move `_rg` to one of your `$fpath` directories. For **PowerShell**, add `. _rg.ps1` to your PowerShell [profile](https://technet.microsoft.com/en-us/library/bb613488(v=vs.85).aspx) (note the leading period). If the `_rg.ps1` file is not on your `PATH`, do `. /path/to/_rg.ps1` instead.

How can I get results in a consistent order?

By default, ripgrep uses parallelism to execute its search because this makes the search much faster on most modern systems. This in turn means that ripgrep has a non-deterministic aspect to it, since the interleaving of threads during the execution of the program is itself non-deterministic. This has the effect of printing results in a somewhat arbitrary order, and this order can change from run to run of ripgrep. The only way to make the order of results consistent is to ask ripgrep to sort the output. Currently, this will disable all parallelism. (On smaller repositories, you might not notice much of a performance difference!) You can achieve this with the `--sort path` flag. There is more discussion on this topic here: https://github.com/BurntSushi/ripgrep/issues/152

How do I search files that aren't UTF-8?

See the [guide's section on file encoding](GUIDE.md#file-encoding).

How do I search compressed files?

ripgrep's `-z/--search-zip` flag will cause it to search compressed files automatically. Currently, this supports gzip, bzip2, xz, lzma, lz4, Brotli and Zstd. Each of these requires requires the corresponding `gzip`, `bzip2`, `xz`, `lz4`, `brotli` and `zstd` binaries to be installed on your system. (That is, ripgrep does decompression by shelling out to another process.) ripgrep currently does not search archive formats, so `*.tar.gz` files, for example, are skipped.

How do I search over multiple lines?

The `-U/--multiline` flag enables ripgrep to report results that span over multiple lines.

How do I use lookaround and/or backreferences?

ripgrep's default regex engine does not support lookaround or backreferences. This is primarily because the default regex engine is implemented using finite state machines in order to guarantee a linear worst case time complexity on all inputs. Backreferences are not possible to implement in this paradigm, and lookaround appears difficult to do efficiently. However, ripgrep optionally supports using PCRE2 as the regex engine instead of the default one based on finite state machines. You can enable PCRE2 with the `-P/--pcre2` flag. For example, in the root of the ripgrep repo, you can easily find all palindromes: ``` $ rg -P '(\w{10})\1' tests/misc.rs 483: cmd.arg("--max-filesize").arg("44444444444444444444"); globset/src/glob.rs 1206: matches!(match7, "a*a*a*a*a*a*a*a*a", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); ``` If your version of ripgrep doesn't support PCRE2, then you'll get an error message when you try to use the `-P/--pcre2` flag: ``` $ rg -P '(\w{10})\1' PCRE2 is not available in this build of ripgrep ``` Most of the releases distributed by the ripgrep project here on GitHub will come bundled with PCRE2 enabled. If you installed ripgrep through a different means (like your system's package manager), then please reach out to the maintainer of that package to see whether it's possible to enable the PCRE2 feature.

How do I configure ripgrep's colors?

ripgrep has two flags related to colors: * `--color` controls *when* to use colors. * `--colors` controls *which* colors to use. The `--color` flag accepts one of the following possible values: `never`, `auto`, `always` or `ansi`. The `auto` value is the default and will cause ripgrep to only enable colors when it is printing to a terminal. But if you pipe ripgrep to a file or some other process, then it will suppress colors. The --colors` flag is a bit more complicated. The general format is: ``` --colors '{type}:{attribute}:{value}' ``` * `{type}` should be one of `path`, `line`, `column` or `match`. Each of these correspond to the four different types of things that ripgrep will add color to in its output. Select the type whose color you want to change. * `{attribute}` should be one of `fg`, `bg` or `style`, corresponding to foreground color, background color, or miscellaneous styling (such as whether to bold the output or not). * `{value}` is determined by the value of `{attribute}`. If `{attribute}` is `style`, then `{value}` should be one of `nobold`, `bold`, `nointense`, `intense`, `nounderline` or `underline`. If `{attribute}` is `fg` or `bg`, then `{value}` should be a color. A color is specified by either one of eight of English names, a single 256-bit number or an RGB triple (with over 16 million possible values, or "true color"). The color names are `red`, `blue`, `green`, `cyan`, `magenta`, `yellow`, `white` or `black`. A single 256-bit number is a value in the range 0-255 (inclusive). It can either be in decimal format (e.g., `62`) or hexadecimal format (e.g., `0x3E`). An RGB triple corresponds to three numbers (decimal or hexadecimal) separated by commas. As a special case, `--colors '{type}:none'` will clear all colors and styles associated with `{type}`, which lets you start with a clean slate (instead of building on top of ripgrep's default color settings). Here's an example that makes highlights the matches with a nice blue background with bolded white text: ``` $ rg somepattern \ --colors 'match:none' \ --colors 'match:bg:0x33,0x66,0xFF' \ --colors 'match:fg:white' \ --colors 'match:style:bold' ``` Colors are an ideal candidate to set in your [configuration file](GUIDE.md#configuration-file). See the [question on emulating The Silver Searcher's output style](#silver-searcher-output) for an example specific to colors.

How do I enable true colors on Windows?

First, see the previous question's [answer on configuring colors](#colors). Secondly, coloring on Windows is a bit complicated. If you're using a terminal like Cygwin, then it's likely true color support already works out of the box. However, if you are using a normal Windows console (`cmd` or `PowerShell`) and a version of Windows prior to 10, then there is no known way to get true color support. If you are on Windows 10 and using a Windows console, then true colors should work out of the box with one caveat: you might need to clear ripgrep's default color settings first. That is, instead of this: ``` $ rg somepattern --colors 'match:fg:0x33,0x66,0xFF' ``` you should do this ``` $ rg somepattern --colors 'match:none' --colors 'match:fg:0x33,0x66,0xFF' ``` This is because ripgrep might set the default style for `match` to `bold`, and it seems like Windows 10's VT100 support doesn't permit bold and true color ANSI escapes to be used simultaneously. The work-around above will clear ripgrep's default styling, allowing you to craft it exactly as desired.

How do I stop ripgrep from messing up colors when I kill it?

Type in `color` in cmd.exe (Command Prompt) and `echo -ne "\033[0m"` on Unix-like systems to restore your original foreground color. In PowerShell, you can add the following code to your profile which will restore the original foreground color when `Reset-ForegroundColor` is called. Including the `Set-Alias` line will allow you to call it with simply `color`. ```powershell $OrigFgColor = $Host.UI.RawUI.ForegroundColor function Reset-ForegroundColor { $Host.UI.RawUI.ForegroundColor = $OrigFgColor } Set-Alias -Name color -Value Reset-ForegroundColor ``` PR [#187](https://github.com/BurntSushi/ripgrep/pull/187) fixed this, and it was later deprecated in [#281](https://github.com/BurntSushi/ripgrep/issues/281). A full explanation is available [here](https://github.com/BurntSushi/ripgrep/issues/281#issuecomment-269093893).

How do I get around the regex size limit?

If you've given ripgrep a particularly large pattern (or a large number of smaller patterns), then it is possible that it will fail to compile because it hit a pre-set limit. For example: ``` $ rg '\pL{1000}' Compiled regex exceeds size limit of 10485760 bytes. ``` (Note: `\pL{1000}` may look small, but `\pL` is the character class containing all Unicode letters, which is quite large. *And* it's repeated 1000 times.) In this case, you can work around by simply increasing the limit: ``` $ rg '\pL{1000}' --regex-size-limit 1G ``` Increasing the limit to 1GB does not necessarily mean that ripgrep will use that much memory. The limit just says that it's allowed to (approximately) use that much memory for constructing the regular expression.

How do I make the -f/--file flag faster?

The `-f/--file` permits one to give a file to ripgrep which contains a pattern on each line. ripgrep will then report any line that matches any of the patterns. If this pattern file gets too big, then it is possible ripgrep will slow down dramatically. *Typically* this is because an internal cache is too small, and will cause ripgrep to spill over to a slower but more robust regular expression engine. If this is indeed the problem, then it is possible to increase this cache and regain speed. The cache can be controlled via the `--dfa-size-limit` flag. For example, using `--dfa-size-limit 1G` will set the cache size to 1GB. (Note that this doesn't mean ripgrep will use 1GB of memory automatically, but it will allow the regex engine to if it needs to.)

How do I make the output look like The Silver Searcher's output?

Use the `--colors` flag, like so: ``` rg --colors line:fg:yellow \ --colors line:style:bold \ --colors path:fg:green \ --colors path:style:bold \ --colors match:fg:black \ --colors match:bg:yellow \ --colors match:style:nobold \ foo ``` Alternatively, add your color configuration to your ripgrep config file (which is activated by setting the `RIPGREP_CONFIG_PATH` environment variable to point to your config file). For example: ``` $ cat $HOME/.config/ripgrep/rc --colors=line:fg:yellow --colors=line:style:bold --colors=path:fg:green --colors=path:style:bold --colors=match:fg:black --colors=match:bg:yellow --colors=match:style:nobold $ RIPGREP_CONFIG_PATH=$HOME/.config/ripgrep/rc rg foo ```

Why does ripgrep get slower when I enable PCRE2 regexes?

When you use the `--pcre2` (`-P` for short) flag, ripgrep will use the PCRE2 regex engine instead of the default. Both regex engines are quite fast, but PCRE2 provides a number of additional features such as look-around and backreferences that many enjoy using. This is largely because PCRE2 uses a backtracking implementation where as the default regex engine uses a finite automaton based implementation. The former provides the ability to add lots of bells and whistles over the latter, but the latter executes with worst case linear time complexity. With that out of the way, if you've used `-P` with ripgrep, you may have noticed that it can be slower. The reasons for why this is are quite complex, and they are complex because the optimizations that ripgrep uses to implement fast search are complex. The task ripgrep has before it is somewhat simple; all it needs to do is search a file for occurrences of some pattern and then print the lines containing those occurrences. The problem lies in what is considered a valid match and how exactly we read the bytes from a file. In terms of what is considered a valid match, remember that ripgrep will only report matches spanning a single line by default. The problem here is that some patterns can match across multiple lines, and ripgrep needs to prevent that from happening. For example, `foo\sbar` will match `foo\nbar`. The most obvious way to achieve this is to read the data from a file, and then apply the pattern search to that data for each line. The problem with this approach is that it can be quite slow; it would be much faster to let the pattern search across as much data as possible. It's faster because it gets rid of the overhead of finding the boundaries of every line, and also because it gets rid of the overhead of starting and stopping the pattern search for every single line. (This is operating under the general assumption that matching lines are much rarer than non-matching lines.) It turns out that we can use the faster approach by applying a very simple restriction to the pattern: *statically prevent* the pattern from matching through a `\n` character. Namely, when given a pattern like `foo\sbar`, ripgrep will remove `\n` from the `\s` character class automatically. In some cases, a simple removal is not so easy. For example, ripgrep will return an error when your pattern includes a `\n` literal: ``` $ rg '\n' the literal '"\n"' is not allowed in a regex ``` So what does this have to do with PCRE2? Well, ripgrep's default regex engine exposes APIs for doing syntactic analysis on the pattern in a way that makes it quite easy to strip `\n` from the pattern (or otherwise detect it and report an error if stripping isn't possible). PCRE2 seemingly does not provide a similar API, so ripgrep does not do any stripping when PCRE2 is enabled. This forces ripgrep to use the "slow" search strategy of searching each line individually. OK, so if enabling PCRE2 slows down the default method of searching because it forces matches to be limited to a single line, then why is PCRE2 also sometimes slower when performing multiline searches? Well, that's because there are *multiple* reasons why using PCRE2 in ripgrep can be slower than the default regex engine. This time, blame PCRE2's Unicode support, which ripgrep enables by default. In particular, PCRE2 cannot simultaneously enable Unicode support and search arbitrary data. That is, when PCRE2's Unicode support is enabled, the data **must** be valid UTF-8 (to do otherwise is to invoke undefined behavior). This is in contrast to ripgrep's default regex engine, which can enable Unicode support and still search arbitrary data. ripgrep's default regex engine simply won't match invalid UTF-8 for a pattern that can otherwise only match valid UTF-8. Why doesn't PCRE2 do the same? This author isn't familiar with its internals, so we can't comment on it here. The bottom line here is that we can't enable PCRE2's Unicode support without simultaneously incurring a performance penalty for ensuring that we are searching valid UTF-8. In particular, ripgrep will transcode the contents of each file to UTF-8 while replacing invalid UTF-8 data with the Unicode replacement codepoint. ripgrep then disables PCRE2's own internal UTF-8 checking, since we've guaranteed the data we hand it will be valid UTF-8. The reason why ripgrep takes this approach is because if we do hand PCRE2 invalid UTF-8, then it will report a match error if it comes across an invalid UTF-8 sequence. This is not good news for ripgrep, since it will stop it from searching the rest of the file, and will also print potentially undesirable error messages to users. All right, the above is a lot of information to swallow if you aren't already familiar with ripgrep internals. Let's make this concrete with some examples. First, let's get some data big enough to magnify the performance differences: ``` $ curl -O 'https://burntsushi.net/stuff/subtitles2016-sample.gz' $ gzip -d subtitles2016-sample $ md5sum subtitles2016-sample e3cb796a20bbc602fbfd6bb43bda45f5 subtitles2016-sample ``` To search this data, we will use the pattern `^\w{42}$`, which contains exactly one hit in the file and has no literals. Having no literals is important, because it ensures that the regex engine won't use literal optimizations to speed up the search. In other words, it lets us reason coherently about the actual task that the regex engine is performing. Let's now walk through a few examples in light of the information above. First, let's consider the default search using ripgrep's default regex engine and then the same search with PCRE2: ``` $ time rg '^\w{42}$' subtitles2016-sample 21225780:EverymajordevelopmentinthehistoryofAmerica real 0m1.783s user 0m1.731s sys 0m0.051s $ time rg -P '^\w{42}$' subtitles2016-sample 21225780:EverymajordevelopmentinthehistoryofAmerica real 0m2.458s user 0m2.419s sys 0m0.038s ``` In this particular example, both pattern searches are using a Unicode aware `\w` character class and both are counting lines in order to report line numbers. The key difference here is that the first search will not search line by line, but the second one will. We can observe which strategy ripgrep uses by passing the `--trace` flag: ``` $ rg '^\w{42}$' subtitles2016-sample --trace [... snip ...] TRACE|grep_searcher::searcher|grep-searcher/src/searcher/mod.rs:622: Some("subtitles2016-sample"): searching via memory map TRACE|grep_searcher::searcher|grep-searcher/src/searcher/mod.rs:712: slice reader: searching via slice-by-line strategy TRACE|grep_searcher::searcher::core|grep-searcher/src/searcher/core.rs:61: searcher core: will use fast line searcher [... snip ...] $ rg -P '^\w{42}$' subtitles2016-sample --trace [... snip ...] TRACE|grep_searcher::searcher|grep-searcher/src/searcher/mod.rs:622: Some("subtitles2016-sample"): searching via memory map TRACE|grep_searcher::searcher|grep-searcher/src/searcher/mod.rs:705: slice reader: needs transcoding, using generic reader TRACE|grep_searcher::searcher|grep-searcher/src/searcher/mod.rs:685: generic reader: searching via roll buffer strategy TRACE|grep_searcher::searcher::core|grep-searcher/src/searcher/core.rs:63: searcher core: will use slow line searcher [... snip ...] ``` The first says it is using the "fast line searcher" where as the latter says it is using the "slow line searcher." The latter also shows that we are decoding the contents of the file, which also impacts performance. Interestingly, in this case, the pattern does not match a `\n` and the file we're searching is valid UTF-8, so neither the slow line-by-line search strategy nor the decoding are necessary. We could fix the former issue with better PCRE2 introspection APIs. We can actually fix the latter issue with ripgrep's `--no-encoding` flag, which prevents the automatic UTF-8 decoding, but will enable PCRE2's own UTF-8 validity checking. Unfortunately, it's slower in my build of ripgrep: ``` $ time rg -P '^\w{42}$' subtitles2016-sample --no-encoding 21225780:EverymajordevelopmentinthehistoryofAmerica real 0m3.074s user 0m3.021s sys 0m0.051s ``` (Tip: use the `--trace` flag to verify that no decoding in ripgrep is happening.) A possible reason why PCRE2's UTF-8 checking is slower is because it might not be better than the highly optimized UTF-8 checking routines found in the [`encoding_rs`](https://github.com/hsivonen/encoding_rs) library, which is what ripgrep uses for UTF-8 decoding. Moreover, my build of ripgrep enables `encoding_rs`'s SIMD optimizations, which may be in play here. Also, note that using the `--no-encoding` flag can cause PCRE2 to report invalid UTF-8 errors, which causes ripgrep to stop searching the file: ``` $ cat invalid-utf8 foobar $ xxd invalid-utf8 00000000: 666f 6fff 6261 720a foo.bar. $ rg foo invalid-utf8 1:foobar $ rg -P foo invalid-utf8 1:foo�bar $ rg -P foo invalid-utf8 --no-encoding invalid-utf8: PCRE2: error matching: UTF-8 error: illegal byte (0xfe or 0xff) ``` All right, so at this point, you might think that we could remove the penalty for line-by-line searching by enabling multiline search. After all, our particular pattern can't match across multiple lines anyway, so we'll still get the results we want. Let's try it: ``` $ time rg -U '^\w{42}$' subtitles2016-sample 21225780:EverymajordevelopmentinthehistoryofAmerica real 0m1.803s user 0m1.748s sys 0m0.054s $ time rg -P -U '^\w{42}$' subtitles2016-sample 21225780:EverymajordevelopmentinthehistoryofAmerica real 0m2.962s user 0m2.246s sys 0m0.713s ``` Search times remain the same with the default regex engine, but the PCRE2 search gets _slower_. What happened? The secrets can be revealed with the `--trace` flag once again. In the former case, ripgrep actually detects that the pattern can't match across multiple lines, and so will fall back to the "fast line search" strategy as with our search without `-U`. However, for PCRE2, things are much worse. Namely, since Unicode mode is still enabled, ripgrep is still going to decode UTF-8 to ensure that it hands only valid UTF-8 to PCRE2. Unfortunately, one key downside of multiline search is that ripgrep cannot do it incrementally. Since matches can be arbitrarily long, ripgrep actually needs the entire file in memory at once. Normally, we can use a memory map for this, but because we need to UTF-8 decode the file before searching it, ripgrep winds up reading the entire contents of the file on to the heap before executing a search. Owch. OK, so Unicode is killing us here. The file we're searching is _mostly_ ASCII, so maybe we're OK with missing some data. (Try `rg '[\w--\p{ascii}]'` to see non-ASCII word characters that an ASCII-only `\w` character class would miss.) We can disable Unicode in both searches, but this is done differently depending on the regex engine we use: ``` $ time rg '(?-u)^\w{42}$' subtitles2016-sample 21225780:EverymajordevelopmentinthehistoryofAmerica real 0m1.714s user 0m1.669s sys 0m0.044s $ time rg -P '^\w{42}$' subtitles2016-sample --no-pcre2-unicode 21225780:EverymajordevelopmentinthehistoryofAmerica real 0m1.997s user 0m1.958s sys 0m0.037s ``` For the most part, ripgrep's default regex engine performs about the same. PCRE2 does improve a little bit, and is now almost as fast as the default regex engine. If you look at the output of `--trace`, you'll see that ripgrep will no longer perform UTF-8 decoding, but it does still use the slow line-by-line searcher. At this point, we can combine all of our insights above: let's try to get off of the slow line-by-line searcher by enabling multiline mode, and let's stop UTF-8 decoding by disabling Unicode support: ``` $ time rg -U '(?-u)^\w{42}$' subtitles2016-sample 21225780:EverymajordevelopmentinthehistoryofAmerica real 0m1.714s user 0m1.655s sys 0m0.058s $ time rg -P -U '^\w{42}$' subtitles2016-sample --no-pcre2-unicode 21225780:EverymajordevelopmentinthehistoryofAmerica real 0m1.121s user 0m1.071s sys 0m0.048s ``` Ah, there's PCRE2's JIT shining! ripgrep's default regex engine once again remains about the same, but PCRE2 no longer needs to search line-by-line and it no longer needs to do any kind of UTF-8 checks. This allows the file to get memory mapped and passed right through PCRE2's JIT at impressive speeds. (As a brief and interesting historical note, the configuration of "memory map + multiline + no-Unicode" is exactly the configuration used by The Silver Searcher. This analysis perhaps sheds some reasoning as to why that configuration is useful!) In summary, if you want PCRE2 to go as fast as possible and you don't care about Unicode and you don't care about matches possibly spanning across multiple lines, then enable multiline mode with `-U` and disable PCRE2's Unicode support with the `--no-pcre2-unicode` flag. Caveat emptor: This author is not a PCRE2 expert, so there may be APIs that can improve performance that the author missed. Similarly, there may be alternative designs for a searching tool that are more amenable to how PCRE2 works.

When I run rg, why does it execute some other command?

It's likely that you have a shell alias or even another tool called `rg` which is interfering with ripgrep. Run `which rg` to see what it is. (Notably, the Rails plug-in for [Oh My Zsh](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins#rails) sets up an `rg` alias for `rails generate`.) Problems like this can be resolved in one of several ways: * If you're using the OMZ Rails plug-in, disable it by editing the `plugins` array in your zsh configuration. * Temporarily bypass an existing `rg` alias by calling ripgrep as `command rg`, `\rg`, or `'rg'`. * Temporarily bypass an existing alias or another tool named `rg` by calling ripgrep by its full path (e.g., `/usr/bin/rg` or `/usr/local/bin/rg`). * Permanently disable an existing `rg` alias by adding `unalias rg` to the bottom of your shell configuration file (e.g., `.bash_profile` or `.zshrc`). * Give ripgrep its own alias that doesn't conflict with other tools/aliases by adding a line like the following to the bottom of your shell configuration file: `alias ripgrep='command rg'`.

How do I create an alias for ripgrep on Windows?

Often you can find a need to make alias for commands you use a lot that set certain flags. But PowerShell function aliases do not behave like your typical linux shell alias. You always need to propagate arguments and `stdin` input. But it cannot be done simply as `function grep() { $input | rg.exe --hidden $args }` Use below example as reference to how setup alias in PowerShell. ```powershell function grep { $count = @($input).Count $input.Reset() if ($count) { $input | rg.exe --hidden $args } else { rg.exe --hidden $args } } ``` PowerShell special variables: * input - is powershell `stdin` object that allows you to access its content. * args - is array of arguments passed to this function. This alias checks whether there is `stdin` input and propagates only if there is some lines. Otherwise empty `$input` will make powershell to trigger `rg` to search empty `stdin`.

How do I create a PowerShell profile?

To customize powershell on start-up, there is a special PowerShell script that has to be created. In order to find its location, type `$profile`. See [Microsoft's documentation](https://technet.microsoft.com/en-us/library/bb613488(v=vs.85).aspx) for more details. Any PowerShell code in this file gets evaluated at the start of console. This way you can have own aliases to be created at start.

How do I pipe non-ASCII content to ripgrep on Windows?

When piping input into native executables in PowerShell, the encoding of the input is controlled by the `$OutputEncoding` variable. By default, this is set to US-ASCII, and any characters in the pipeline that don't have encodings in US-ASCII are converted to `?` (question mark) characters. To change this setting, set `$OutputEncoding` to a different encoding, as represented by a .NET encoding object. Some common examples are below. The value of this variable is reset when PowerShell restarts, so to make this change take effect every time PowerShell is started add a line setting the variable into your PowerShell profile. Example `$OutputEncoding` settings: * UTF-8 without BOM: `$OutputEncoding = [System.Text.UTF8Encoding]::new()` * The console's output encoding: `$OutputEncoding = [System.Console]::OutputEncoding` If you continue to have encoding problems, you can also force the encoding that the console will use for printing to UTF-8 with `[System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8`. This will also reset when PowerShell is restarted, so you can add that line to your profile as well if you want to make the setting permanent.

How can I search and replace with ripgrep?

Using ripgrep alone, you can't. ripgrep is a search tool that will never touch your files. However, the output of ripgrep can be piped to other tools that do modify files on disk. See [this issue](https://github.com/BurntSushi/ripgrep/issues/74) for more information. sed is one such tool that can modify files on disk. sed can take a filename and a substitution command to search and replace in the specified file. Files containing matching patterns can be provided to sed using ``` rg foo --files-with-matches ``` The output of this command is a list of filenames that contain a match for the `foo` pattern. This list can be piped into `xargs`, which will split the filenames from standard input into arguments for the command following xargs. You can use this combination to pipe a list of filenames into sed for replacement. For example: ``` rg foo --files-with-matches | xargs sed -i 's/foo/bar/g' ``` will replace all instances of 'foo' with 'bar' in the files in which ripgrep finds the foo pattern. The `-i` flag to sed indicates that you are editing files in place, and `s/foo/bar/g` says that you are performing a **s**ubstitution of the pattren `foo` for `bar`, and that you are doing this substitution **g**lobally (all occurrences of the pattern in each file). Note: the above command assumes that you are using GNU sed. If you are using BSD sed (the default on macOS and FreeBSD) then you must modify the above command to be the following: ``` rg foo --files-with-matches | xargs sed -i '' 's/foo/bar/g' ``` The `-i` flag in BSD sed requires a file extension to be given to make backups for all modified files. Specifying the empty string prevents file backups from being made. Finally, if any of your file paths contain whitespace in them, then you might need to delimit your file paths with a NUL terminator. This requires telling ripgrep to output NUL bytes between each path, and telling xargs to read paths delimited by NUL bytes: ``` rg foo --files-with-matches -0 | xargs -0 sed -i 's/foo/bar/g' ``` To learn more about sed, see the sed manual [here](https://www.gnu.org/software/sed/manual/sed.html). Additionally, Facebook has a tool called [fastmod](https://github.com/facebookincubator/fastmod) that uses some of the same libraries as ripgrep and might provide a more ergonomic search-and-replace experience.

How is ripgrep licensed?

ripgrep is dual licensed under the [Unlicense](https://unlicense.org/) and MIT licenses. Specifically, you may use ripgrep under the terms of either license. The reason why ripgrep is dual licensed this way is two-fold: 1. I, as ripgrep's author, would like to participate in a small bit of ideological activism by promoting the Unlicense's goal: to disclaim copyright monopoly interest. 2. I, as ripgrep's author, would like as many people to use rigprep as possible. Since the Unlicense is not a proven or well known license, ripgrep is also offered under the MIT license, which is ubiquitous and accepted by almost everyone. More specifically, ripgrep and all its dependencies are compatible with this licensing choice. In particular, ripgrep's dependencies (direct and transitive) will always be limited to permissive licenses. That is, ripgrep will never depend on code that is not permissively licensed. This means rejecting any dependency that uses a copyleft license such as the GPL, LGPL, MPL or any of the Creative Commons ShareAlike licenses. Whether the license is "weak" copyleft or not does not matter; ripgrep will **not** depend on it.

Can ripgrep replace grep?

Yes and no. If, upon hearing that "ripgrep can replace grep," you *actually* hear, "ripgrep can be used in every instance grep can be used, in exactly the same way, for the same use cases, with exactly the same bug-for-bug behavior," then no, ripgrep trivially *cannot* replace grep. Moreover, ripgrep will *never* replace grep. If, upon hearing that "ripgrep can replace grep," you *actually* hear, "ripgrep can replace grep in some cases and not in other use cases," then yes, that is indeed true! Let's go over some of those use cases in favor of ripgrep. Some of these may not apply to you. That's OK. There may be other use cases not listed here that do apply to you. That's OK too. (For all claims related to performance in the following words, see my [blog post](https://blog.burntsushi.net/ripgrep/) introducing ripgrep.) * Are you frequently searching a repository of code? If so, ripgrep might be a good choice since there's likely a good chunk of your repository that you don't want to search. grep, can, of course, be made to filter files using recursive search, and if you don't mind writing out the requisite `--exclude` rules or writing wrapper scripts, then grep might be sufficient. (I'm not kidding, I myself did this with grep for almost a decade before writing ripgrep.) But if you instead enjoy having a search tool respect your `.gitignore`, then ripgrep might be perfect for you! * Are you frequently searching non-ASCII text that is UTF-8 encoded? One of ripgrep's key features is that it can handle Unicode features in your patterns in a way that tends to be faster than GNU grep. Unicode features in ripgrep are enabled by default; there is no need to configure your locale settings to use ripgrep properly because ripgrep doesn't respect your locale settings. * Do you need to search UTF-16 files and you don't want to bother explicitly transcoding them? Great. ripgrep does this for you automatically. No need to enable it. * Do you need to search a large directory of large files? ripgrep uses parallelism by default, which tends to make it faster than a standard `grep -r` search. However, if you're OK writing the occasional `find ./ -print0 | xargs -P8 -0 grep` command, then maybe grep is good enough. Here are some cases where you might *not* want to use ripgrep. The same caveats for the previous section apply. * Are you writing portable shell scripts intended to work in a variety of environments? Great, probably not a good idea to use ripgrep! ripgrep is has nowhere near the ubiquity of grep, so if you do use ripgrep, you might need to futz with the installation process more than you would with grep. * Do you care about POSIX compatibility? If so, then you can't use ripgrep because it never was, isn't and never will be POSIX compatible. * Do you hate tools that try to do something smart? If so, ripgrep is all about being smart, so you might prefer to just stick with grep. * Is there a particular feature of grep you rely on that ripgrep either doesn't have or never will have? If the former, file a bug report, maybe ripgrep can do it! If the latter, well, then, just use grep.

What does the "rip" in ripgrep mean?

When I first started writing ripgrep, I called it `rep`, intending it to be a shorter variant of `grep`. Soon after, I renamed it to `xrep` since `rep` wasn't obvious enough of a name for my taste. And also because adding `x` to anything always makes it better, right? Before ripgrep's first public release, I decided that I didn't like `xrep`. I thought it was slightly awkward to type, and despite my previous praise of the letter `x`, I kind of thought it was pretty lame. Being someone who really likes Rust, I wanted to call it "rustgrep" or maybe "rgrep" for short. But I thought that was just as lame, and maybe a little too in-your-face. But I wanted to continue using `r` so I could at least pretend Rust had something to do with it. I spent a couple of days trying to think of very short words that began with the letter `r` that were even somewhat related to the task of searching. I don't remember how it popped into my head, but "rip" came up as something that meant "fast," as in, "to rip through your text." The fact that RIP is also an initialism for "Rest in Peace" (as in, "ripgrep kills grep") never really dawned on me. Perhaps the coincidence is too striking to believe that, but I didn't realize it until someone explicitly pointed it out to me after the initial public release. I admit that I found it mildly amusing, but if I had realized it myself before the public release, I probably would have pressed on and chose a different name. Alas, renaming things after a release is hard, so I decided to mush on. Given the fact that [ripgrep never was, is or will be a 100% drop-in replacement for grep](#posix4ever), ripgrep is neither actually a "grep killer" nor was it ever intended to be. It certainly does eat into some of its use cases, but that's nothing that other tools like ack or The Silver Searcher weren't already doing. ripgrep-11.0.2/GUIDE.md010064400017500000144000000770341351372666500126700ustar0000000000000000## User Guide This guide is intended to give an elementary description of ripgrep and an overview of its capabilities. This guide assumes that ripgrep is [installed](README.md#installation) and that readers have passing familiarity with using command line tools. This also assumes a Unix-like system, although most commands are probably easily translatable to any command line shell environment. ### Table of Contents * [Basics](#basics) * [Recursive search](#recursive-search) * [Automatic filtering](#automatic-filtering) * [Manual filtering: globs](#manual-filtering-globs) * [Manual filtering: file types](#manual-filtering-file-types) * [Replacements](#replacements) * [Configuration file](#configuration-file) * [File encoding](#file-encoding) * [Binary data](#binary-data) * [Common options](#common-options) ### Basics ripgrep is a command line tool that searches your files for patterns that you give it. ripgrep behaves as if reading each file line by line. If a line matches the pattern provided to ripgrep, then that line will be printed. If a line does not match the pattern, then the line is not printed. The best way to see how this works is with an example. To show an example, we need something to search. Let's try searching ripgrep's source code. First grab a ripgrep source archive from https://github.com/BurntSushi/ripgrep/archive/0.7.1.zip and extract it: ``` $ curl -LO https://github.com/BurntSushi/ripgrep/archive/0.7.1.zip $ unzip 0.7.1.zip $ cd ripgrep-0.7.1 $ ls benchsuite grep tests Cargo.toml LICENSE-MIT ci ignore wincolor CHANGELOG.md README.md complete pkg appveyor.yml compile snapcraft.yaml doc src build.rs COPYING UNLICENSE globset termcolor Cargo.lock HomebrewFormula ``` Let's try our first search by looking for all occurrences of the word `fast` in `README.md`: ``` $ rg fast README.md 75: faster than both. (N.B. It is not, strictly speaking, a "drop-in" replacement 88: color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast while 119:### Is it really faster than everything else? 124:Summarizing, `ripgrep` is fast because: 129: optimizations to make searching very fast. ``` (**Note:** If you see an error message from ripgrep saying that it didn't search any files, then re-run ripgrep with the `--debug` flag. One likely cause of this is that you have a `*` rule in a `$HOME/.gitignore` file.) So what happened here? ripgrep read the contents of `README.md`, and for each line that contained `fast`, ripgrep printed it to your terminal. ripgrep also included the line number for each line by default. If your terminal supports colors, then your output might actually look something like this screenshot: [![A screenshot of a sample search ripgrep](https://burntsushi.net/stuff/ripgrep-guide-sample.png)](https://burntsushi.net/stuff/ripgrep-guide-sample.png) In this example, we searched for something called a "literal" string. This means that our pattern was just some normal text that we asked ripgrep to find. But ripgrep supports the ability to specify patterns via [regular expressions](https://en.wikipedia.org/wiki/Regular_expression). As an example, what if we wanted to find all lines have a word that contains `fast` followed by some number of other letters? ``` $ rg 'fast\w+' README.md 75: faster than both. (N.B. It is not, strictly speaking, a "drop-in" replacement 119:### Is it really faster than everything else? ``` In this example, we used the pattern `fast\w+`. This pattern tells ripgrep to look for any lines containing the letters `fast` followed by *one or more* word-like characters. Namely, `\w` matches characters that compose words (like `a` and `L` but unlike `.` and ` `). The `+` after the `\w` means, "match the previous pattern one or more times." This means that the word `fast` won't match because there are no word characters following the final `t`. But a word like `faster` will. `faste` would also match! Here's a different variation on this same theme: ``` $ rg 'fast\w*' README.md 75: faster than both. (N.B. It is not, strictly speaking, a "drop-in" replacement 88: color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast while 119:### Is it really faster than everything else? 124:Summarizing, `ripgrep` is fast because: 129: optimizations to make searching very fast. ``` In this case, we used `fast\w*` for our pattern instead of `fast\w+`. The `*` means that it should match *zero* or more times. In this case, ripgrep will print the same lines as the pattern `fast`, but if your terminal supports colors, you'll notice that `faster` will be highlighted instead of just the `fast` prefix. It is beyond the scope of this guide to provide a full tutorial on regular expressions, but ripgrep's specific syntax is documented here: https://docs.rs/regex/*/regex/#syntax ### Recursive search In the previous section, we showed how to use ripgrep to search a single file. In this section, we'll show how to use ripgrep to search an entire directory of files. In fact, *recursively* searching your current working directory is the default mode of operation for ripgrep, which means doing this is very simple. Using our unzipped archive of ripgrep source code, here's how to find all function definitions whose name is `write`: ``` $ rg 'fn write\(' src/printer.rs 469: fn write(&mut self, buf: &[u8]) { termcolor/src/lib.rs 227: fn write(&mut self, b: &[u8]) -> io::Result { 250: fn write(&mut self, b: &[u8]) -> io::Result { 428: fn write(&mut self, b: &[u8]) -> io::Result { self.wtr.write(b) } 441: fn write(&mut self, b: &[u8]) -> io::Result { self.wtr.write(b) } 454: fn write(&mut self, buf: &[u8]) -> io::Result { 511: fn write(&mut self, buf: &[u8]) -> io::Result { 848: fn write(&mut self, buf: &[u8]) -> io::Result { 915: fn write(&mut self, buf: &[u8]) -> io::Result { 949: fn write(&mut self, buf: &[u8]) -> io::Result { 1114: fn write(&mut self, buf: &[u8]) -> io::Result { 1348: fn write(&mut self, buf: &[u8]) -> io::Result { 1353: fn write(&mut self, buf: &[u8]) -> io::Result { ``` (**Note:** We escape the `(` here because `(` has special significance inside regular expressions. You could also use `rg -F 'fn write('` to achieve the same thing, where `-F` interprets your pattern as a literal string instead of a regular expression.) In this example, we didn't specify a file at all. Instead, ripgrep defaulted to searching your current directory in the absence of a path. In general, `rg foo` is equivalent to `rg foo ./`. This particular search showed us results in both the `src` and `termcolor` directories. The `src` directory is the core ripgrep code where as `termcolor` is a dependency of ripgrep (and is used by other tools). What if we only wanted to search core ripgrep code? Well, that's easy, just specify the directory you want: ``` $ rg 'fn write\(' src src/printer.rs 469: fn write(&mut self, buf: &[u8]) { ``` Here, ripgrep limited its search to the `src` directory. Another way of doing this search would be to `cd` into the `src` directory and simply use `rg 'fn write\('` again. ### Automatic filtering After recursive search, ripgrep's most important feature is what it *doesn't* search. By default, when you search a directory, ripgrep will ignore all of the following: 1. Files and directories that match the rules in your `.gitignore` glob pattern. 2. Hidden files and directories. 3. Binary files. (ripgrep considers any file with a `NUL` byte to be binary.) 4. Symbolic links aren't followed. All of these things can be toggled using various flags provided by ripgrep: 1. You can disable `.gitignore` handling with the `--no-ignore` flag. 2. Hidden files and directories can be searched with the `--hidden` flag. 3. Binary files can be searched via the `--text` (`-a` for short) flag. Be careful with this flag! Binary files may emit control characters to your terminal, which might cause strange behavior. 4. ripgrep can follow symlinks with the `--follow` (`-L` for short) flag. As a special convenience, ripgrep also provides a flag called `--unrestricted` (`-u` for short). Repeated uses of this flag will cause ripgrep to disable more and more of its filtering. That is, `-u` will disable `.gitignore` handling, `-uu` will search hidden files and directories and `-uuu` will search binary files. This is useful when you're using ripgrep and you aren't sure whether its filtering is hiding results from you. Tacking on a couple `-u` flags is a quick way to find out. (Use the `--debug` flag if you're still perplexed, and if that doesn't help, [file an issue](https://github.com/BurntSushi/ripgrep/issues/new).) ripgrep's `.gitignore` handling actually goes a bit beyond just `.gitignore` files. ripgrep will also respect repository specific rules found in `$GIT_DIR/info/exclude`, as well as any global ignore rules in your `core.excludesFile` (which is usually `$XDG_CONFIG_HOME/git/ignore` on Unix-like systems). Sometimes you want to search files that are in your `.gitignore`, so it is possible to specify additional ignore rules or overrides in a `.ignore` (application agnostic) or `.rgignore` (ripgrep specific) file. For example, let's say you have a `.gitignore` file that looks like this: ``` log/ ``` This generally means that any `log` directory won't be tracked by `git`. However, perhaps it contains useful output that you'd like to include in your searches, but you still don't want to track it in `git`. You can achieve this by creating a `.ignore` file in the same directory as the `.gitignore` file with the following contents: ``` !log/ ``` ripgrep treats `.ignore` files with higher precedence than `.gitignore` files (and treats `.rgignore` files with higher precedence than `.ignore` files). This means ripgrep will see the `!log/` whitelist rule first and search that directory. Like `.gitignore`, a `.ignore` file can be placed in any directory. Its rules will be processed with respect to the directory it resides in, just like `.gitignore`. To process `.gitignore` and `.ignore` files case insensitively, use the flag `--ignore-file-case-insensitive`. This is especially useful on case insensitive file systems like those on Windows and macOS. Note though that this can come with a significant performance penalty, and is therefore disabled by default. For a more in depth description of how glob patterns in a `.gitignore` file are interpreted, please see `man gitignore`. ### Manual filtering: globs In the previous section, we talked about ripgrep's filtering that it does by default. It is "automatic" because it reacts to your environment. That is, it uses already existing `.gitignore` files to produce more relevant search results. In addition to automatic filtering, ripgrep also provides more manual or ad hoc filtering. This comes in two varieties: additional glob patterns specified in your ripgrep commands and file type filtering. This section covers glob patterns while the next section covers file type filtering. In our ripgrep source code (see [Basics](#basics) for instructions on how to get a source archive to search), let's say we wanted to see which things depend on `clap`, our argument parser. We could do this: ``` $ rg clap [lots of results] ``` But this shows us many things, and we're only interested in where we wrote `clap` as a dependency. Instead, we could limit ourselves to TOML files, which is how dependencies are communicated to Rust's build tool, Cargo: ``` $ rg clap -g '*.toml' Cargo.toml 35:clap = "2.26" 51:clap = "2.26" ``` The `-g '*.toml'` syntax says, "make sure every file searched matches this glob pattern." Note that we put `'*.toml'` in single quotes to prevent our shell from expanding the `*`. If we wanted, we could tell ripgrep to search anything *but* `*.toml` files: ``` $ rg clap -g '!*.toml' [lots of results] ``` This will give you a lot of results again as above, but they won't include files ending with `.toml`. Note that the use of a `!` here to mean "negation" is a bit non-standard, but it was chosen to be consistent with how globs in `.gitignore` files are written. (Although, the meaning is reversed. In `.gitignore` files, a `!` prefix means whitelist, and on the command line, a `!` means blacklist.) Globs are interpreted in exactly the same way as `.gitignore` patterns. That is, later globs will override earlier globs. For example, the following command will search only `*.toml` files: ``` $ rg clap -g '!*.toml' -g '*.toml' ``` Interestingly, reversing the order of the globs in this case will match nothing, since the presence of at least one non-blacklist glob will institute a requirement that every file searched must match at least one glob. In this case, the blacklist glob takes precedence over the previous glob and prevents any file from being searched at all! ### Manual filtering: file types Over time, you might notice that you use the same glob patterns over and over. For example, you might find yourself doing a lot of searches where you only want to see results for Rust files: ``` $ rg 'fn run' -g '*.rs' ``` Instead of writing out the glob every time, you can use ripgrep's support for file types: ``` $ rg 'fn run' --type rust ``` or, more succinctly, ``` $ rg 'fn run' -trust ``` The way the `--type` flag functions is simple. It acts as a name that is assigned to one or more globs that match the relevant files. This lets you write a single type that might encompass a broad range of file extensions. For example, if you wanted to search C files, you'd have to check both C source files and C header files: ``` $ rg 'int main' -g '*.{c,h}' ``` or you could just use the C file type: ``` $ rg 'int main' -tc ``` Just as you can write blacklist globs, you can blacklist file types too: ``` $ rg clap --type-not rust ``` or, more succinctly, ``` $ rg clap -Trust ``` That is, `-t` means "include files of this type" where as `-T` means "exclude files of this type." To see the globs that make up a type, run `rg --type-list`: ``` $ rg --type-list | rg '^make:' make: *.mak, *.mk, GNUmakefile, Gnumakefile, Makefile, gnumakefile, makefile ``` By default, ripgrep comes with a bunch of pre-defined types. Generally, these types correspond to well known public formats. But you can define your own types as well. For example, perhaps you frequently search "web" files, which consist of Javascript, HTML and CSS: ``` $ rg --type-add 'web:*.html' --type-add 'web:*.css' --type-add 'web:*.js' -tweb title ``` or, more succinctly, ``` $ rg --type-add 'web:*.{html,css,js}' -tweb title ``` The above command defines a new type, `web`, corresponding to the glob `*.{html,css,js}`. It then applies the new filter with `-tweb` and searches for the pattern `title`. If you ran ``` $ rg --type-add 'web:*.{html,css,js}' --type-list ``` Then you would see your `web` type show up in the list, even though it is not part of ripgrep's built-in types. It is important to stress here that the `--type-add` flag only applies to the current command. It does not add a new file type and save it somewhere in a persistent form. If you want a type to be available in every ripgrep command, then you should either create a shell alias: ``` alias rg="rg --type-add 'web:*.{html,css,js}'" ``` or add `--type-add=web:*.{html,css,js}` to your ripgrep configuration file. ([Configuration files](#configuration-file) are covered in more detail later.) ### Replacements ripgrep provides a limited ability to modify its output by replacing matched text with some other text. This is easiest to explain with an example. Remember when we searched for the word `fast` in ripgrep's README? ``` $ rg fast README.md 75: faster than both. (N.B. It is not, strictly speaking, a "drop-in" replacement 88: color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast while 119:### Is it really faster than everything else? 124:Summarizing, `ripgrep` is fast because: 129: optimizations to make searching very fast. ``` What if we wanted to *replace* all occurrences of `fast` with `FAST`? That's easy with ripgrep's `--replace` flag: ``` $ rg fast README.md --replace FAST 75: FASTer than both. (N.B. It is not, strictly speaking, a "drop-in" replacement 88: color and full Unicode support. Unlike GNU grep, `ripgrep` stays FAST while 119:### Is it really FASTer than everything else? 124:Summarizing, `ripgrep` is FAST because: 129: optimizations to make searching very FAST. ``` or, more succinctly, ``` $ rg fast README.md -r FAST [snip] ``` In essence, the `--replace` flag applies *only* to the matching portion of text in the output. If you instead wanted to replace an entire line of text, then you need to include the entire line in your match. For example: ``` $ rg '^.*fast.*$' README.md -r FAST 75:FAST 88:FAST 119:FAST 124:FAST 129:FAST ``` Alternatively, you can combine the `--only-matching` (or `-o` for short) with the `--replace` flag to achieve the same result: ``` $ rg fast README.md --only-matching --replace FAST 75:FAST 88:FAST 119:FAST 124:FAST 129:FAST ``` or, more succinctly, ``` $ rg fast README.md -or FAST [snip] ``` Finally, replacements can include capturing groups. For example, let's say we wanted to find all occurrences of `fast` followed by another word and join them together with a dash. The pattern we might use for that is `fast\s+(\w+)`, which matches `fast`, followed by any amount of whitespace, followed by any number of "word" characters. We put the `\w+` in a "capturing group" (indicated by parentheses) so that we can reference it later in our replacement string. For example: ``` $ rg 'fast\s+(\w+)' README.md -r 'fast-$1' 88: color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast-while 124:Summarizing, `ripgrep` is fast-because: ``` Our replacement string here, `fast-$1`, consists of `fast-` followed by the contents of the capturing group at index `1`. (Capturing groups actually start at index 0, but the `0`th capturing group always corresponds to the entire match. The capturing group at index `1` always corresponds to the first explicit capturing group found in the regex pattern.) Capturing groups can also be named, which is sometimes more convenient than using the indices. For example, the following command is equivalent to the above command: ``` $ rg 'fast\s+(?P\w+)' README.md -r 'fast-$word' 88: color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast-while 124:Summarizing, `ripgrep` is fast-because: ``` It is important to note that ripgrep **will never modify your files**. The `--replace` flag only controls ripgrep's output. (And there is no flag to let you do a replacement in a file.) ### Configuration file It is possible that ripgrep's default options aren't suitable in every case. For that reason, and because shell aliases aren't always convenient, ripgrep supports configuration files. Setting up a configuration file is simple. ripgrep will not look in any predetermined directory for a config file automatically. Instead, you need to set the `RIPGREP_CONFIG_PATH` environment variable to the file path of your config file. Once the environment variable is set, open the file and just type in the flags you want set automatically. There are only two rules for describing the format of the config file: 1. Every line is a shell argument, after trimming whitespace. 2. Lines starting with `#` (optionally preceded by any amount of whitespace) are ignored. In particular, there is no escaping. Each line is given to ripgrep as a single command line argument verbatim. Here's an example of a configuration file, which demonstrates some of the formatting peculiarities: ``` $ cat $HOME/.ripgreprc # Don't let ripgrep vomit really long lines to my terminal, and show a preview. --max-columns=150 --max-columns-preview # Add my 'web' type. --type-add web:*.{html,css,js}* # Using glob patterns to include/exclude files or folders --glob=!git/* # or --glob !git/* # Set the colors. --colors=line:none --colors=line:style:bold # Because who cares about case!? --smart-case ``` When we use a flag that has a value, we either put the flag and the value on the same line but delimited by an `=` sign (e.g., `--max-columns=150`), or we put the flag and the value on two different lines. This is because ripgrep's argument parser knows to treat the single argument `--max-columns=150` as a flag with a value, but if we had written `--max-columns 150` in our configuration file, then ripgrep's argument parser wouldn't know what to do with it. Putting the flag and value on different lines is exactly equivalent and is a matter of style. Comments are encouraged so that you remember what the config is doing. Empty lines are OK too. So let's say you're using the above configuration file, but while you're at a terminal, you really want to be able to see lines longer than 150 columns. What do you do? Thankfully, all you need to do is pass `--max-columns 0` (or `-M0` for short) on the command line, which will override your configuration file's setting. This works because ripgrep's configuration file is *prepended* to the explicit arguments you give it on the command line. Since flags given later override flags given earlier, everything works as expected. This works for most other flags as well, and each flag's documentation states which other flags override it. If you're confused about what configuration file ripgrep is reading arguments from, then running ripgrep with the `--debug` flag should help clarify things. The debug output should note what config file is being loaded and the arguments that have been read from the configuration. Finally, if you want to make absolutely sure that ripgrep *isn't* reading a configuration file, then you can pass the `--no-config` flag, which will always prevent ripgrep from reading extraneous configuration from the environment, regardless of what other methods of configuration are added to ripgrep in the future. ### File encoding [Text encoding](https://en.wikipedia.org/wiki/Character_encoding) is a complex topic, but we can try to summarize its relevancy to ripgrep: * Files are generally just a bundle of bytes. There is no reliable way to know their encoding. * Either the encoding of the pattern must match the encoding of the files being searched, or a form of transcoding must be performed that converts either the pattern or the file to the same encoding as the other. * ripgrep tends to work best on plain text files, and among plain text files, the most popular encodings likely consist of ASCII, latin1 or UTF-8. As a special exception, UTF-16 is prevalent in Windows environments In light of the above, here is how ripgrep behaves when `--encoding auto` is given, which is the default: * All input is assumed to be ASCII compatible (which means every byte that corresponds to an ASCII codepoint actually is an ASCII codepoint). This includes ASCII itself, latin1 and UTF-8. * ripgrep works best with UTF-8. For example, ripgrep's regular expression engine supports Unicode features. Namely, character classes like `\w` will match all word characters by Unicode's definition and `.` will match any Unicode codepoint instead of any byte. These constructions assume UTF-8, so they simply won't match when they come across bytes in a file that aren't UTF-8. * To handle the UTF-16 case, ripgrep will do something called "BOM sniffing" by default. That is, the first three bytes of a file will be read, and if they correspond to a UTF-16 BOM, then ripgrep will transcode the contents of the file from UTF-16 to UTF-8, and then execute the search on the transcoded version of the file. (This incurs a performance penalty since transcoding is slower than regex searching.) If the file contains invalid UTF-16, then the Unicode replacement codepoint is substituted in place of invalid code units. * To handle other cases, ripgrep provides a `-E/--encoding` flag, which permits you to specify an encoding from the [Encoding Standard](https://encoding.spec.whatwg.org/#concept-encoding-get). ripgrep will assume *all* files searched are the encoding specified (unless the file has a BOM) and will perform a transcoding step just like in the UTF-16 case described above. By default, ripgrep will not require its input be valid UTF-8. That is, ripgrep can and will search arbitrary bytes. The key here is that if you're searching content that isn't UTF-8, then the usefulness of your pattern will degrade. If you're searching bytes that aren't ASCII compatible, then it's likely the pattern won't find anything. With all that said, this mode of operation is important, because it lets you find ASCII or UTF-8 *within* files that are otherwise arbitrary bytes. As a special case, the `-E/--encoding` flag supports the value `none`, which will completely disable all encoding related logic, including BOM sniffing. When `-E/--encoding` is set to `none`, ripgrep will search the raw bytes of the underlying file with no transcoding step. For example, here's how you might search the raw UTF-16 encoding of the string `Шерлок`: ``` $ rg '(?-u)\(\x045\x04@\x04;\x04>\x04:\x04' -E none -a some-utf16-file ``` Of course, that's just an example meant to show how one can drop down into raw bytes. Namely, the simpler command works as you might expect automatically: ``` $ rg 'Шерлок' some-utf16-file ``` Finally, it is possible to disable ripgrep's Unicode support from within the regular expression. For example, let's say you wanted `.` to match any byte rather than any Unicode codepoint. (You might want this while searching a binary file, since `.` by default will not match invalid UTF-8.) You could do this by disabling Unicode via a regular expression flag: ``` $ rg '(?-u:.)' ``` This works for any part of the pattern. For example, the following will find any Unicode word character followed by any ASCII word character followed by another Unicode word character: ``` $ rg '\w(?-u:\w)\w' ``` ### Binary data In addition to skipping hidden files and files in your `.gitignore` by default, ripgrep also attempts to skip binary files. ripgrep does this by default because binary files (like PDFs or images) are typically not things you want to search when searching for regex matches. Moreover, if content in a binary file did match, then it's possible for undesirable binary data to be printed to your terminal and wreak havoc. Unfortunately, unlike skipping hidden files and respecting your `.gitignore` rules, a file cannot as easily be classified as binary. In order to figure out whether a file is binary, the most effective heuristic that balances correctness with performance is to simply look for `NUL` bytes. At that point, the determination is simple: a file is considered "binary" if and only if it contains a `NUL` byte somewhere in its contents. The issue is that while most binary files will have a `NUL` byte toward the beginning of its contents, this is not necessarily true. The `NUL` byte might be the very last byte in a large file, but that file is still considered binary. While this leads to a fair amount of complexity inside ripgrep's implementation, it also results in some unintuitive user experiences. At a high level, ripgrep operates in three different modes with respect to binary files: 1. The default mode is to attempt to remove binary files from a search completely. This is meant to mirror how ripgrep removes hidden files and files in your `.gitignore` automatically. That is, as soon as a file is detected as binary, searching stops. If a match was already printed (because it was detected long before a `NUL` byte), then ripgrep will print a warning message indicating that the search stopped prematurely. This default mode **only applies to files searched by ripgrep as a result of recursive directory traversal**, which is consistent with ripgrep's other automatic filtering. For example, `rg foo .file` will search `.file` even though it is hidden. Similarly, `rg foo binary-file` search `binary-file` in "binary" mode automatically. 2. Binary mode is similar to the default mode, except it will not always stop searching after it sees a `NUL` byte. Namely, in this mode, ripgrep will continue searching a file that is known to be binary until the first of two conditions is met: 1) the end of the file has been reached or 2) a match is or has been seen. This means that in binary mode, if ripgrep reports no matches, then there are no matches in the file. When a match does occur, ripgrep prints a message similar to one it prints when in its default mode indicating that the search has stopped prematurely. This mode can be forcefully enabled for all files with the `--binary` flag. The purpose of binary mode is to provide a way to discover matches in all files, but to avoid having binary data dumped into your terminal. 3. Text mode completely disables all binary detection and searches all files as if they were text. This is useful when searching a file that is predominantly text but contains a `NUL` byte, or if you are specifically trying to search binary data. This mode can be enabled with the `-a/--text` flag. Note that when using this mode on very large binary files, it is possible for ripgrep to use a lot of memory. Unfortunately, there is one additional complexity in ripgrep that can make it difficult to reason about binary files. That is, the way binary detection works depends on the way that ripgrep searches your files. Specifically: * When ripgrep uses memory maps, then binary detection is only performed on the first few kilobytes of the file in addition to every matching line. * When ripgrep doesn't use memory maps, then binary detection is performed on all bytes searched. This means that whether a file is detected as binary or not can change based on the internal search strategy used by ripgrep. If you prefer to keep ripgrep's binary file detection consistent, then you can disable memory maps via the `--no-mmap` flag. (The cost will be a small performance regression when searching very large files on some platforms.) ### Common options ripgrep has a lot of flags. Too many to keep in your head at once. This section is intended to give you a sampling of some of the most important and frequently used options that will likely impact how you use ripgrep on a regular basis. * `-h`: Show ripgrep's condensed help output. * `--help`: Show ripgrep's longer form help output. (Nearly what you'd find in ripgrep's man page, so pipe it into a pager!) * `-i/--ignore-case`: When searching for a pattern, ignore case differences. That is `rg -i fast` matches `fast`, `fASt`, `FAST`, etc. * `-S/--smart-case`: This is similar to `--ignore-case`, but disables itself if the pattern contains any uppercase letters. Usually this flag is put into alias or a config file. * `-w/--word-regexp`: Require that all matches of the pattern be surrounded by word boundaries. That is, given `pattern`, the `--word-regexp` flag will cause ripgrep to behave as if `pattern` were actually `\b(?:pattern)\b`. * `-c/--count`: Report a count of total matched lines. * `--files`: Print the files that ripgrep *would* search, but don't actually search them. * `-a/--text`: Search binary files as if they were plain text. * `-z/--search-zip`: Search compressed files (gzip, bzip2, lzma, xz, lz4, brotli, zstd). This is disabled by default. * `-C/--context`: Show the lines surrounding a match. * `--sort path`: Force ripgrep to sort its output by file name. (This disables parallelism, so it might be slower.) * `-L/--follow`: Follow symbolic links while recursively searching. * `-M/--max-columns`: Limit the length of lines printed by ripgrep. * `--debug`: Shows ripgrep's debug output. This is useful for understanding why a particular file might be ignored from search, or what kinds of configuration ripgrep is loading from the environment. ripgrep-11.0.2/ISSUE_TEMPLATE.md010064400017500000144000000031371351372666500142070ustar0000000000000000#### What version of ripgrep are you using? Replace this text with the output of `rg --version`. #### How did you install ripgrep? If you installed ripgrep with snap and are getting strange file permission or file not found errors, then please do not file a bug. Instead, use one of the Github binary releases. #### What operating system are you using ripgrep on? Replace this text with your operating system and version. #### Describe your question, feature request, or bug. If a question, please describe the problem you're trying to solve and give as much context as possible. If a feature request, please describe the behavior you want and the motivation. Please also provide an example of how ripgrep would be used if your feature request were added. If a bug, please see below. #### If this is a bug, what are the steps to reproduce the behavior? If possible, please include both your search patterns and the corpus on which you are searching. Unless the bug is very obvious, then it is unlikely that it will be fixed if the ripgrep maintainers cannot reproduce it. If the corpus is too big and you cannot decrease its size, file the bug anyway and the ripgrep maintainers will help figure out next steps. #### If this is a bug, what is the actual behavior? Show the command you ran and the actual output. Include the `--debug` flag in your invocation of ripgrep. If the output is large, put it in a gist: https://gist.github.com/ If the output is small, put it in code fences: ``` your output goes here ``` #### If this is a bug, what is the expected behavior? What do you think ripgrep should have done? ripgrep-11.0.2/LICENSE-MIT010064400017500000144000000020711274016737500131300ustar0000000000000000The MIT License (MIT) Copyright (c) 2015 Andrew Gallant Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ripgrep-11.0.2/README.md010064400017500000144000000415421352066051600127510ustar0000000000000000ripgrep (rg) ------------ ripgrep is a line-oriented search tool that recursively searches your current directory for a regex pattern. By default, ripgrep will respect your .gitignore and automatically skip hidden files/directories and binary files. ripgrep has first class support on Windows, macOS and Linux, with binary downloads available for [every release](https://github.com/BurntSushi/ripgrep/releases). ripgrep is similar to other popular search tools like The Silver Searcher, ack and grep. [![Linux build status](https://travis-ci.org/BurntSushi/ripgrep.svg)](https://travis-ci.org/BurntSushi/ripgrep) [![Windows build status](https://ci.appveyor.com/api/projects/status/github/BurntSushi/ripgrep?svg=true)](https://ci.appveyor.com/project/BurntSushi/ripgrep) [![Crates.io](https://img.shields.io/crates/v/ripgrep.svg)](https://crates.io/crates/ripgrep) [![Packaging status](https://repology.org/badge/tiny-repos/ripgrep.svg)](https://repology.org/project/ripgrep/badges) Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org). ### CHANGELOG Please see the [CHANGELOG](CHANGELOG.md) for a release history. ### Documentation quick links * [Installation](#installation) * [User Guide](GUIDE.md) * [Frequently Asked Questions](FAQ.md) * [Regex syntax](https://docs.rs/regex/1/regex/#syntax) * [Configuration files](GUIDE.md#configuration-file) * [Shell completions](FAQ.md#complete) * [Building](#building) * [Translations](#translations) ### Screenshot of search results [![A screenshot of a sample search with ripgrep](http://burntsushi.net/stuff/ripgrep1.png)](http://burntsushi.net/stuff/ripgrep1.png) ### Quick examples comparing tools This example searches the entire Linux kernel source tree (after running `make defconfig && make -j8`) for `[A-Z]+_SUSPEND`, where all matches must be words. Timings were collected on a system with an Intel i7-6900K 3.2 GHz, and ripgrep was compiled with SIMD enabled. Please remember that a single benchmark is never enough! See my [blog post on ripgrep](http://blog.burntsushi.net/ripgrep/) for a very detailed comparison with more benchmarks and analysis. | Tool | Command | Line count | Time | | ---- | ------- | ---------- | ---- | | ripgrep (Unicode) | `rg -n -w '[A-Z]+_SUSPEND'` | 450 | **0.106s** | | [git grep](https://www.kernel.org/pub/software/scm/git/docs/git-grep.html) | `LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND'` | 450 | 0.553s | | [The Silver Searcher](https://github.com/ggreer/the_silver_searcher) | `ag -w '[A-Z]+_SUSPEND'` | 450 | 0.589s | | [git grep (Unicode)](https://www.kernel.org/pub/software/scm/git/docs/git-grep.html) | `LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND'` | 450 | 2.266s | | [sift](https://github.com/svent/sift) | `sift --git -n -w '[A-Z]+_SUSPEND'` | 450 | 3.505s | | [ack](https://github.com/petdance/ack2) | `ack -w '[A-Z]+_SUSPEND'` | 1878 | 6.823s | | [The Platinum Searcher](https://github.com/monochromegane/the_platinum_searcher) | `pt -w -e '[A-Z]+_SUSPEND'` | 450 | 14.208s | (Yes, `ack` [has](https://github.com/petdance/ack2/issues/445) a [bug](https://github.com/petdance/ack2/issues/14).) Here's another benchmark that disregards gitignore files and searches with a whitelist instead. The corpus is the same as in the previous benchmark, and the flags passed to each command ensure that they are doing equivalent work: | Tool | Command | Line count | Time | | ---- | ------- | ---------- | ---- | | ripgrep | `rg -L -u -tc -n -w '[A-Z]+_SUSPEND'` | 404 | **0.079s** | | [ucg](https://github.com/gvansickle/ucg) | `ucg --type=cc -w '[A-Z]+_SUSPEND'` | 390 | 0.163s | | [GNU grep](https://www.gnu.org/software/grep/) | `egrep -R -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND'` | 404 | 0.611s | (`ucg` [has slightly different behavior in the presence of symbolic links](https://github.com/gvansickle/ucg/issues/106).) And finally, a straight-up comparison between ripgrep and GNU grep on a single large file (~9.3GB, [`OpenSubtitles2016.raw.en.gz`](http://opus.lingfil.uu.se/OpenSubtitles2016/mono/OpenSubtitles2016.raw.en.gz)): | Tool | Command | Line count | Time | | ---- | ------- | ---------- | ---- | | ripgrep | `rg -w 'Sherlock [A-Z]\w+'` | 5268 | **2.108s** | | [GNU grep](https://www.gnu.org/software/grep/) | `LC_ALL=C egrep -w 'Sherlock [A-Z]\w+'` | 5268 | 7.014s | In the above benchmark, passing the `-n` flag (for showing line numbers) increases the times to `2.640s` for ripgrep and `10.277s` for GNU grep. ### Why should I use ripgrep? * It can replace many use cases served by other search tools because it contains most of their features and is generally faster. (See [the FAQ](FAQ.md#posix4ever) for more details on whether ripgrep can truly replace grep.) * Like other tools specialized to code search, ripgrep defaults to recursive directory search and won't search files ignored by your `.gitignore`/`.ignore`/`.rgignore` files. It also ignores hidden and binary files by default. ripgrep also implements full support for `.gitignore`, whereas there are many bugs related to that functionality in other code search tools claiming to provide the same functionality. * ripgrep can search specific types of files. For example, `rg -tpy foo` limits your search to Python files and `rg -Tjs foo` excludes Javascript files from your search. ripgrep can be taught about new file types with custom matching rules. * ripgrep supports many features found in `grep`, such as showing the context of search results, searching multiple patterns, highlighting matches with color and full Unicode support. Unlike GNU grep, ripgrep stays fast while supporting Unicode (which is always on). * ripgrep has optional support for switching its regex engine to use PCRE2. Among other things, this makes it possible to use look-around and backreferences in your patterns, which are not supported in ripgrep's default regex engine. PCRE2 support can be enabled with `-P/--pcre2` (use PCRE2 always) or `--auto-hybrid-regex` (use PCRE2 only if needed). * ripgrep supports searching files in text encodings other than UTF-8, such as UTF-16, latin-1, GBK, EUC-JP, Shift_JIS and more. (Some support for automatically detecting UTF-16 is provided. Other text encodings must be specifically specified with the `-E/--encoding` flag.) * ripgrep supports searching files compressed in a common format (brotli, bzip2, gzip, lz4, lzma, xz, or zstandard) with the `-z/--search-zip` flag. * ripgrep supports arbitrary input preprocessing filters which could be PDF text extraction, less supported decompression, decrypting, automatic encoding detection and so on. In other words, use ripgrep if you like speed, filtering by default, fewer bugs and Unicode support. ### Why shouldn't I use ripgrep? Despite initially not wanting to add every feature under the sun to ripgrep, over time, ripgrep has grown support for most features found in other file searching tools. This includes searching for results spanning across multiple lines, and opt-in support for PCRE2, which provides look-around and backreference support. At this point, the primary reasons not to use ripgrep probably consist of one or more of the following: * You need a portable and ubiquitous tool. While ripgrep works on Windows, macOS and Linux, it is not ubiquitous and it does not conform to any standard such as POSIX. The best tool for this job is good old grep. * There still exists some other feature (or bug) not listed in this README that you rely on that's in another tool that isn't in ripgrep. * There is a performance edge case where ripgrep doesn't do well where another tool does do well. (Please file a bug report!) * ripgrep isn't possible to install on your machine or isn't available for your platform. (Please file a bug report!) ### Is it really faster than everything else? Generally, yes. A large number of benchmarks with detailed analysis for each is [available on my blog](http://blog.burntsushi.net/ripgrep/). Summarizing, ripgrep is fast because: * It is built on top of [Rust's regex engine](https://github.com/rust-lang-nursery/regex). Rust's regex engine uses finite automata, SIMD and aggressive literal optimizations to make searching very fast. (PCRE2 support can be opted into with the `-P/--pcre2` flag.) * Rust's regex library maintains performance with full Unicode support by building UTF-8 decoding directly into its deterministic finite automaton engine. * It supports searching with either memory maps or by searching incrementally with an intermediate buffer. The former is better for single files and the latter is better for large directories. ripgrep chooses the best searching strategy for you automatically. * Applies your ignore patterns in `.gitignore` files using a [`RegexSet`](https://docs.rs/regex/1/regex/struct.RegexSet.html). That means a single file path can be matched against multiple glob patterns simultaneously. * It uses a lock-free parallel recursive directory iterator, courtesy of [`crossbeam`](https://docs.rs/crossbeam) and [`ignore`](https://docs.rs/ignore). ### Feature comparison Andy Lester, author of [ack](https://beyondgrep.com/), has published an excellent table comparing the features of ack, ag, git-grep, GNU grep and ripgrep: https://beyondgrep.com/feature-comparison/ Note that ripgrep has grown a few significant new features recently that are not yet present in Andy's table. This includes, but is not limited to, configuration files, passthru, support for searching compressed files, multiline search and opt-in fancy regex support via PCRE2. ### Installation The binary name for ripgrep is `rg`. **[Archives of precompiled binaries for ripgrep are available for Windows, macOS and Linux.](https://github.com/BurntSushi/ripgrep/releases)** Users of platforms not explicitly mentioned below are advised to download one of these archives. Linux binaries are static executables. Windows binaries are available either as built with MinGW (GNU) or with Microsoft Visual C++ (MSVC). When possible, prefer MSVC over GNU, but you'll need to have the [Microsoft VC++ 2015 redistributable](https://www.microsoft.com/en-us/download/details.aspx?id=48145) installed. If you're a **macOS Homebrew** or a **Linuxbrew** user, then you can install ripgrep either from homebrew-core, (compiled with rust stable, no SIMD): ``` $ brew install ripgrep ``` If you're a **MacPorts** user, then you can install ripgrep from the [official ports](https://www.macports.org/ports.php?by=name&substr=ripgrep): ``` $ sudo port install ripgrep ``` If you're a **Windows Chocolatey** user, then you can install ripgrep from the [official repo](https://chocolatey.org/packages/ripgrep): ``` $ choco install ripgrep ``` If you're a **Windows Scoop** user, then you can install ripgrep from the [official bucket](https://github.com/ScoopInstaller/Main/blob/master/bucket/ripgrep.json): ``` $ scoop install ripgrep ``` If you're an **Arch Linux** user, then you can install ripgrep from the official repos: ``` $ pacman -S ripgrep ``` If you're a **Gentoo** user, you can install ripgrep from the [official repo](https://packages.gentoo.org/packages/sys-apps/ripgrep): ``` $ emerge sys-apps/ripgrep ``` If you're a **Fedora** user, you can install ripgrep from official repositories. ``` $ sudo dnf install ripgrep ``` If you're an **openSUSE Leap 15.0** user, you can install ripgrep from the [utilities repo](https://build.opensuse.org/package/show/utilities/ripgrep): ``` $ sudo zypper ar https://download.opensuse.org/repositories/utilities/openSUSE_Leap_15.0/utilities.repo $ sudo zypper install ripgrep ``` If you're an **openSUSE Tumbleweed** user, you can install ripgrep from the [official repo](http://software.opensuse.org/package/ripgrep): ``` $ sudo zypper install ripgrep ``` If you're a **RHEL/CentOS 7** user, you can install ripgrep from [copr](https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/): ``` $ sudo yum-config-manager --add-repo=https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/repo/epel-7/carlwgeorge-ripgrep-epel-7.repo $ sudo yum install ripgrep ``` If you're a **Nix** user, you can install ripgrep from [nixpkgs](https://github.com/NixOS/nixpkgs/blob/master/pkgs/tools/text/ripgrep/default.nix): ``` $ nix-env --install ripgrep $ # (Or using the attribute name, which is also ripgrep.) ``` If you're a **Debian** user (or a user of a Debian derivative like **Ubuntu**), then ripgrep can be installed using a binary `.deb` file provided in each [ripgrep release](https://github.com/BurntSushi/ripgrep/releases). ``` $ curl -LO https://github.com/BurntSushi/ripgrep/releases/download/11.0.2/ripgrep_11.0.2_amd64.deb $ sudo dpkg -i ripgrep_11.0.2_amd64.deb ``` If you run Debian Buster (currently Debian testing) or Debian sid, ripgrep is [officially maintained by Debian](https://tracker.debian.org/pkg/rust-ripgrep). ``` $ sudo apt-get install ripgrep ``` If you're an **Ubuntu Cosmic (18.10)** (or newer) user, ripgrep is [available](https://launchpad.net/ubuntu/+source/rust-ripgrep) using the same packaging as Debian: ``` $ sudo apt-get install ripgrep ``` (N.B. Various snaps for ripgrep on Ubuntu are also available, but none of them seem to work right and generate a number of very strange bug reports that I don't know how to fix and don't have the time to fix. Therefore, it is no longer a recommended installation option.) If you're a **FreeBSD** user, then you can install ripgrep from the [official ports](https://www.freshports.org/textproc/ripgrep/): ``` # pkg install ripgrep ``` If you're an **OpenBSD** user, then you can install ripgrep from the [official ports](http://openports.se/textproc/ripgrep): ``` $ doas pkg_add ripgrep ``` If you're a **NetBSD** user, then you can install ripgrep from [pkgsrc](http://pkgsrc.se/textproc/ripgrep): ``` # pkgin install ripgrep ``` If you're a **Rust programmer**, ripgrep can be installed with `cargo`. * Note that the minimum supported version of Rust for ripgrep is **1.34.0**, although ripgrep may work with older versions. * Note that the binary may be bigger than expected because it contains debug symbols. This is intentional. To remove debug symbols and therefore reduce the file size, run `strip` on the binary. ``` $ cargo install ripgrep ``` ### Building ripgrep is written in Rust, so you'll need to grab a [Rust installation](https://www.rust-lang.org/) in order to compile it. ripgrep compiles with Rust 1.34.0 (stable) or newer. In general, ripgrep tracks the latest stable release of the Rust compiler. To build ripgrep: ``` $ git clone https://github.com/BurntSushi/ripgrep $ cd ripgrep $ cargo build --release $ ./target/release/rg --version 0.1.3 ``` If you have a Rust nightly compiler and a recent Intel CPU, then you can enable additional optional SIMD acceleration like so: ``` RUSTFLAGS="-C target-cpu=native" cargo build --release --features 'simd-accel' ``` The `simd-accel` feature enables SIMD support in certain ripgrep dependencies (responsible for transcoding). They are not necessary to get SIMD optimizations for search; those are enabled automatically. Hopefully, some day, the `simd-accel` feature will similarly become unnecessary. **WARNING:** Currently, enabling this option can increase compilation times dramatically. Finally, optional PCRE2 support can be built with ripgrep by enabling the `pcre2` feature: ``` $ cargo build --release --features 'pcre2' ``` (Tip: use `--features 'pcre2 simd-accel'` to also include compile time SIMD optimizations, which will only work with a nightly compiler.) Enabling the PCRE2 feature works with a stable Rust compiler and will attempt to automatically find and link with your system's PCRE2 library via `pkg-config`. If one doesn't exist, then ripgrep will build PCRE2 from source using your system's C compiler and then statically link it into the final executable. Static linking can be forced even when there is an available PCRE2 system library by either building ripgrep with the MUSL target or by setting `PCRE2_SYS_STATIC=1`. ripgrep can be built with the MUSL target on Linux by first installing the MUSL library on your system (consult your friendly neighborhood package manager). Then you just need to add MUSL support to your Rust toolchain and rebuild ripgrep, which yields a fully static executable: ``` $ rustup target add x86_64-unknown-linux-musl $ cargo build --release --target x86_64-unknown-linux-musl ``` Applying the `--features` flag from above works as expected. If you want to build a static executable with MUSL and with PCRE2, then you will need to have `musl-gcc` installed, which might be in a separate package from the actual MUSL library, depending on your Linux distribution. ### Running tests ripgrep is relatively well-tested, including both unit tests and integration tests. To run the full test suite, use: ``` $ cargo test --all ``` from the repository root. ### Translations The following is a list of known translations of ripgrep's documentation. These are unofficially maintained and may not be up to date. * [Chinese](https://github.com/chinanf-boy/ripgrep-zh#%E6%9B%B4%E6%96%B0-) ripgrep-11.0.2/UNLICENSE010064400017500000144000000022731274016737500127500ustar0000000000000000This is free and unencumbered software released into the public domain. Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to ripgrep-11.0.2/appveyor.yml010064400017500000144000000040561351372666500140730ustar0000000000000000cache: - c:\cargo\registry - c:\cargo\git init: - mkdir c:\cargo - mkdir c:\rustup - SET PATH=c:\cargo\bin;%PATH% clone_folder: c:\projects\ripgrep environment: CARGO_HOME: "c:\\cargo" RUSTUP_HOME: "c:\\rustup" CARGO_TARGET_DIR: "c:\\projects\\ripgrep\\target" global: PROJECT_NAME: ripgrep RUST_BACKTRACE: full matrix: - TARGET: x86_64-pc-windows-gnu CHANNEL: stable BITS: 64 MSYS2: 1 - TARGET: x86_64-pc-windows-msvc CHANNEL: stable BITS: 64 - TARGET: i686-pc-windows-gnu CHANNEL: stable BITS: 32 MSYS2: 1 - TARGET: i686-pc-windows-msvc CHANNEL: stable BITS: 32 matrix: fast_finish: true # Install Rust and Cargo # (Based on from https://github.com/rust-lang/libc/blob/master/appveyor.yml) install: - curl -sSf -o rustup-init.exe https://win.rustup.rs/ - rustup-init.exe -y --default-host %TARGET% - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin - if defined MSYS2 set PATH=C:\msys64\mingw%BITS%\bin;%PATH% - rustc -V - cargo -V # Hack to work around a harmless warning in Appveyor builds? build: false # Equivalent to Travis' `script` phase test_script: - cargo test --verbose --all --features pcre2 before_deploy: # Generate artifacts for release - cargo build --release --features pcre2 - mkdir staging - copy target\release\rg.exe staging - ps: copy target\release\build\ripgrep-*\out\_rg.ps1 staging - cd staging # release zipfile will look like 'ripgrep-1.2.3-x86_64-pc-windows-msvc' - 7z a ../%PROJECT_NAME%-%APPVEYOR_REPO_TAG_NAME%-%TARGET%.zip * - appveyor PushArtifact ../%PROJECT_NAME%-%APPVEYOR_REPO_TAG_NAME%-%TARGET%.zip deploy: description: 'Automatically deployed release' # All the zipped artifacts will be deployed artifact: /.*\.zip/ auth_token: secure: vv4vBCEosGlyQjaEC1+kraP2P6O4CQSa+Tw50oHWFTGcmuXxaWS0/yEXbxsIRLpw provider: GitHub # deploy when a new tag is pushed and only on the stable channel on: CHANNEL: stable appveyor_repo_tag: true branches: only: - /^\d+\.\d+\.\d+$/ - master ripgrep-11.0.2/benchsuite/benchsuite010075500017500000144000001343341351372665700157170ustar0000000000000000#!/usr/bin/env python3 ''' benchsuite is a benchmark runner for comparing command line search tools. ''' import argparse import csv import os import os.path as path from multiprocessing import cpu_count import re import shutil import statistics import subprocess import sys import time # Some constants for identifying the corpora we use to run tests. # We establish two very different kinds of corpora: a small number of large # files and a large number of small files. These are vastly different use cases # not only because of their performance characteristics, but also the # strategies used to increase the relevance of results returned. SUBTITLES_DIR = 'subtitles' SUBTITLES_EN_NAME = 'OpenSubtitles2016.raw.en' SUBTITLES_EN_NAME_SAMPLE = 'OpenSubtitles2016.raw.sample.en' SUBTITLES_EN_NAME_GZ = '%s.gz' % SUBTITLES_EN_NAME SUBTITLES_EN_URL = 'http://opus.lingfil.uu.se/OpenSubtitles2016/mono/OpenSubtitles2016.raw.en.gz' # noqa SUBTITLES_RU_NAME = 'OpenSubtitles2016.raw.ru' SUBTITLES_RU_NAME_GZ = '%s.gz' % SUBTITLES_RU_NAME SUBTITLES_RU_URL = 'http://opus.lingfil.uu.se/OpenSubtitles2016/mono/OpenSubtitles2016.raw.ru.gz' # noqa LINUX_DIR = 'linux' LINUX_CLONE = 'git://github.com/BurntSushi/linux' # Grep takes locale settings from the environment. There is a *substantial* # performance impact for enabling Unicode, so we need to handle this explicitly # in our benchmarks. GREP_ASCII = {'LC_ALL': 'C'} GREP_UNICODE = {'LC_ALL': 'en_US.UTF-8'} # Sift tries really hard to search everything by default. In our code search # benchmarks, we don't want that. SIFT = [ 'sift', '--binary-skip', '--exclude-files', '.*', '--exclude-files', '*.pdf', ] def bench_linux_literal_default(suite_dir): ''' Benchmark the speed of a literal using *default* settings. This is a purposefully unfair benchmark for use in performance analysis, but it is pedagogically useful to demonstrate how default behaviors differ. ''' require(suite_dir, 'linux') cwd = path.join(suite_dir, LINUX_DIR) pat = 'PM_RESUME' def mkcmd(*args, **kwargs): kwargs['cwd'] = cwd return Command(*args, **kwargs) return Benchmark(pattern=pat, commands=[ mkcmd('rg', ['rg', pat]), mkcmd('ag', ['ag', pat]), # ucg reports the exact same matches as ag and rg even though it # doesn't read gitignore files. Instead, it has a file whitelist # that happens to match up exactly with the gitignores for this search. mkcmd('ucg', ['ucg', pat]), # I guess setting LC_ALL=en_US.UTF-8 probably isn't necessarily the # default, but I'd guess it to be on most desktop systems. mkcmd('pt', ['pt', pat]), # sift reports an extra line here for a binary file matched. mkcmd('sift', ['sift', pat]), mkcmd('git grep', ['git', 'grep', pat], env={'LC_ALL': 'en_US.UTF-8'}), ]) def bench_linux_literal(suite_dir): ''' Benchmark the speed of a literal, attempting to be fair. This tries to use the minimum set of options available in all tools to test how fast they are. For example, it makes sure there is no case insensitive matching and that line numbers are computed (because some tools don't permit disabling line numbers). ''' require(suite_dir, 'linux') cwd = path.join(suite_dir, LINUX_DIR) pat = 'PM_RESUME' def mkcmd(*args, **kwargs): kwargs['cwd'] = cwd return Command(*args, **kwargs) return Benchmark(pattern=pat, commands=[ mkcmd('rg (ignore)', ['rg', '-n', pat]), mkcmd('rg (ignore) (mmap)', ['rg', '-n', '--mmap', pat]), mkcmd('ag (ignore) (mmap)', ['ag', '-s', pat]), mkcmd('pt (ignore)', ['pt', pat]), mkcmd('sift (ignore)', SIFT + ['-n', '--git', pat]), mkcmd('git grep (ignore)', [ 'git', 'grep', '-I', '-n', pat, ], env={'LC_ALL': 'C'}), mkcmd('rg (whitelist)', ['rg', '-n', '--no-ignore', '-tall', pat]), mkcmd('ucg (whitelist)', ['ucg', '--nosmart-case', pat]), ]) def bench_linux_literal_casei(suite_dir): ''' Benchmark the speed of a case insensitive literal search. This is like the linux_literal benchmark, except we ask the search tools to do case insensitive search. ''' require(suite_dir, 'linux') cwd = path.join(suite_dir, LINUX_DIR) pat = 'PM_RESUME' def mkcmd(*args, **kwargs): kwargs['cwd'] = cwd return Command(*args, **kwargs) return Benchmark(pattern=pat, commands=[ mkcmd('rg (ignore)', ['rg', '-n', '-i', pat]), mkcmd('rg (ignore) (mmap)', ['rg', '-n', '-i', '--mmap', pat]), mkcmd('ag (ignore) (mmap)', ['ag', '-i', pat]), mkcmd('pt (ignore)', ['pt', '-i', pat]), mkcmd('sift (ignore)', SIFT + ['-n', '-i', '--git', pat]), # It'd technically be more appropriate to set LC_ALL=en_US.UTF-8 here, # since that is certainly what ripgrep is doing, but this is for an # ASCII literal, so we should give `git grep` all the opportunity to # do its best. mkcmd('git grep (ignore)', [ 'git', 'grep', '-I', '-n', '-i', pat, ], env={'LC_ALL': 'C'}), mkcmd('rg (whitelist)', [ 'rg', '-n', '-i', '--no-ignore', '-tall', pat, ]), mkcmd('ucg (whitelist)', ['ucg', '-i', pat]), ]) def bench_linux_re_literal_suffix(suite_dir): ''' Benchmark the speed of a literal inside a regex. This, for example, inhibits a prefix byte optimization used inside of Go's regex engine (relevant for sift and pt). ''' require(suite_dir, 'linux') cwd = path.join(suite_dir, LINUX_DIR) pat = '[A-Z]+_RESUME' def mkcmd(*args, **kwargs): kwargs['cwd'] = cwd return Command(*args, **kwargs) return Benchmark(pattern=pat, commands=[ mkcmd('rg (ignore)', ['rg', '-n', pat]), mkcmd('ag (ignore)', ['ag', '-s', pat]), mkcmd('pt (ignore)', ['pt', '-e', pat]), mkcmd('sift (ignore)', SIFT + ['-n', '--git', pat]), mkcmd( 'git grep (ignore)', ['git', 'grep', '-E', '-I', '-n', pat], env={'LC_ALL': 'C'}, ), mkcmd('rg (whitelist)', ['rg', '-n', '--no-ignore', '-tall', pat]), mkcmd('ucg (whitelist)', ['ucg', '--nosmart-case', pat]), ]) def bench_linux_word(suite_dir): ''' Benchmark use of the -w ("match word") flag in each tool. sift has a lot of trouble with this because it forces it into Go's regex engine by surrounding the pattern with \b assertions. ''' require(suite_dir, 'linux') cwd = path.join(suite_dir, LINUX_DIR) pat = 'PM_RESUME' def mkcmd(*args, **kwargs): kwargs['cwd'] = cwd return Command(*args, **kwargs) return Benchmark(pattern=pat, commands=[ mkcmd('rg (ignore)', ['rg', '-n', '-w', pat]), mkcmd('ag (ignore)', ['ag', '-s', '-w', pat]), mkcmd('pt (ignore)', ['pt', '-w', pat]), mkcmd('sift (ignore)', SIFT + ['-n', '-w', '--git', pat]), mkcmd( 'git grep (ignore)', ['git', 'grep', '-E', '-I', '-n', '-w', pat], env={'LC_ALL': 'C'}, ), mkcmd('rg (whitelist)', [ 'rg', '-n', '-w', '--no-ignore', '-tall', pat, ]), mkcmd('ucg (whitelist)', ['ucg', '--nosmart-case', '-w', pat]), ]) def bench_linux_unicode_greek(suite_dir): ''' Benchmark matching of a Unicode category. Only three tools (ripgrep, sift and pt) support this. We omit pt because it is too slow. ''' require(suite_dir, 'linux') cwd = path.join(suite_dir, LINUX_DIR) pat = r'\p{Greek}' def mkcmd(*args, **kwargs): kwargs['cwd'] = cwd return Command(*args, **kwargs) return Benchmark(pattern=pat, commands=[ mkcmd('rg', ['rg', '-n', pat]), mkcmd('pt', ['pt', '-e', pat]), mkcmd('sift', SIFT + ['-n', '--git', pat]), ]) def bench_linux_unicode_greek_casei(suite_dir): ''' Benchmark matching of a Unicode category, case insensitively. Only ripgrep gets this right (and it's still fast). ''' require(suite_dir, 'linux') cwd = path.join(suite_dir, LINUX_DIR) pat = r'\p{Greek}' def mkcmd(*args, **kwargs): kwargs['cwd'] = cwd return Command(*args, **kwargs) return Benchmark(pattern=pat, commands=[ mkcmd('rg', ['rg', '-n', '-i', pat]), mkcmd('pt', ['pt', '-i', '-e', pat]), mkcmd('sift', SIFT + ['-n', '-i', '--git', pat]), ]) def bench_linux_unicode_word(suite_dir): ''' Benchmark Unicode aware \w character class. Only ripgrep and git-grep (with LC_ALL=en_US.UTF-8) actually get this right. Everything else uses the standard ASCII interpretation of \w. ''' require(suite_dir, 'linux') cwd = path.join(suite_dir, LINUX_DIR) pat = r'\wAh' def mkcmd(*args, **kwargs): kwargs['cwd'] = cwd return Command(*args, **kwargs) return Benchmark(pattern=pat, commands=[ mkcmd('rg (ignore)', ['rg', '-n', pat]), mkcmd('rg (ignore) (ASCII)', ['rg', '-n', '(?-u)' + pat]), mkcmd('ag (ignore) (ASCII)', ['ag', '-s', pat]), mkcmd('pt (ignore) (ASCII)', ['pt', '-e', pat]), mkcmd('sift (ignore) (ASCII)', SIFT + ['-n', '--git', pat]), mkcmd( 'git grep (ignore)', ['git', 'grep', '-E', '-I', '-n', pat], env={'LC_ALL': 'en_US.UTF-8'}, ), mkcmd( 'git grep (ignore) (ASCII)', ['git', 'grep', '-E', '-I', '-n', pat], env={'LC_ALL': 'C'}, ), mkcmd('rg (whitelist)', ['rg', '-n', '--no-ignore', '-tall', pat]), mkcmd('rg (whitelist) (ASCII)', [ 'rg', '-n', '--no-ignore', '-tall', '(?-u)' + pat, ]), mkcmd('ucg (ASCII)', ['ucg', '--nosmart-case', pat]), ]) def bench_linux_no_literal(suite_dir): ''' Benchmark a regex that defeats all literal optimizations. Most search patterns have some kind of literal in them, which typically permits searches to take some shortcuts. Therefore, the applicability of this benchmark is somewhat suspicious, but the suite wouldn't feel complete without it. ''' require(suite_dir, 'linux') cwd = path.join(suite_dir, LINUX_DIR) pat = r'\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}' def mkcmd(*args, **kwargs): kwargs['cwd'] = cwd return Command(*args, **kwargs) return Benchmark(pattern=pat, commands=[ mkcmd('rg (ignore)', ['rg', '-n', pat]), mkcmd('rg (ignore) (ASCII)', ['rg', '-n', '(?-u)' + pat]), mkcmd('ag (ignore) (ASCII)', ['ag', '-s', pat]), mkcmd('pt (ignore) (ASCII)', ['pt', '-e', pat]), mkcmd('sift (ignore) (ASCII)', SIFT + ['-n', '--git', pat]), mkcmd( 'git grep (ignore)', ['git', 'grep', '-E', '-I', '-n', pat], env={'LC_ALL': 'en_US.UTF-8'}, ), mkcmd( 'git grep (ignore) (ASCII)', ['git', 'grep', '-E', '-I', '-n', pat], env={'LC_ALL': 'C'}, ), mkcmd('rg (whitelist)', ['rg', '-n', '--no-ignore', '-tall', pat]), mkcmd('rg (whitelist) (ASCII)', [ 'rg', '-n', '--no-ignore', '-tall', '(?-u)' + pat, ]), mkcmd('ucg (whitelist) (ASCII)', ['ucg', '--nosmart-case', pat]), ]) def bench_linux_alternates(suite_dir): ''' Benchmark a small alternation of literals. sift doesn't make the cut. It's more than 10x slower than the next fastest result. The slowdown is likely because the Go regexp engine doesn't do any literal optimizations for this case (there is no common leading byte). ''' require(suite_dir, 'linux') cwd = path.join(suite_dir, LINUX_DIR) pat = 'ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT' def mkcmd(*args, **kwargs): kwargs['cwd'] = cwd return Command(*args, **kwargs) return Benchmark(pattern=pat, commands=[ mkcmd('rg (ignore)', ['rg', '-n', pat]), mkcmd('ag (ignore)', ['ag', '-s', pat]), mkcmd( 'git grep (ignore)', ['git', 'grep', '-E', '-I', '-n', pat], env={'LC_ALL': 'C'}, ), mkcmd('rg (whitelist)', ['rg', '--no-ignore', '-n', pat]), mkcmd('ucg (whitelist)', ['ucg', '--nosmart-case', pat]), ]) def bench_linux_alternates_casei(suite_dir): 'Benchmark a small alternation of literals case insensitively.' require(suite_dir, 'linux') cwd = path.join(suite_dir, LINUX_DIR) pat = 'ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT' def mkcmd(*args, **kwargs): kwargs['cwd'] = cwd return Command(*args, **kwargs) return Benchmark(pattern=pat, commands=[ mkcmd('rg (ignore)', ['rg', '-n', '-i', pat]), mkcmd('ag (ignore)', ['ag', '-i', pat]), mkcmd( 'git grep (ignore)', ['git', 'grep', '-E', '-I', '-n', '-i', pat], env={'LC_ALL': 'C'}, ), mkcmd('rg (whitelist)', ['rg', '--no-ignore', '-n', '-i', pat]), mkcmd('ucg (whitelist)', ['ucg', '-i', pat]), ]) def bench_subtitles_en_literal(suite_dir): ''' Benchmark the speed of an ASCII string literal. ''' require(suite_dir, 'subtitles-en') en = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_EN_NAME_SAMPLE) pat = 'Sherlock Holmes' return Benchmark(pattern=pat, commands=[ Command('rg', ['rg', pat, en]), Command('rg (no mmap)', ['rg', '--no-mmap', pat, en]), Command('pt', ['pt', '-N', pat, en]), Command('sift', ['sift', pat, en]), Command('grep', ['grep', '-a', pat, en], env=GREP_ASCII), Command('rg (lines)', ['rg', '-n', pat, en]), Command('ag (lines)', ['ag', '-s', pat, en]), Command('ucg (lines)', ['ucg', '--nosmart-case', pat, en]), Command('pt (lines)', ['pt', pat, en]), Command('sift (lines)', ['sift', '-n', pat, en]), Command('grep (lines)', ['grep', '-an', pat, en], env=GREP_ASCII), ]) def bench_subtitles_en_literal_casei(suite_dir): ''' Benchmark the speed of a Unicode-y string case insensitively. ''' require(suite_dir, 'subtitles-en') en = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_EN_NAME_SAMPLE) pat = 'Sherlock Holmes' return Benchmark(pattern=pat, commands=[ Command('rg', ['rg', '-i', pat, en]), Command('grep', ['grep', '-ai', pat, en], env=GREP_UNICODE), Command('grep (ASCII)', [ 'grep', '-E', '-ai', pat, en, ], env=GREP_ASCII), Command('rg (lines)', ['rg', '-n', '-i', pat, en]), Command('ag (lines) (ASCII)', ['ag', '-i', pat, en]), Command('ucg (lines) (ASCII)', ['ucg', '-i', pat, en]), ]) def bench_subtitles_en_literal_word(suite_dir): ''' Benchmark the speed of finding a literal inside word boundaries. ''' require(suite_dir, 'subtitles-en') en = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_EN_NAME_SAMPLE) pat = 'Sherlock Holmes' return Benchmark(pattern=pat, commands=[ Command('rg (ASCII)', [ 'rg', '-n', r'(?-u:\b)' + pat + r'(?-u:\b)', en, ]), Command('ag (ASCII)', ['ag', '-sw', pat, en]), Command('ucg (ASCII)', ['ucg', '--nosmart-case', pat, en]), Command('grep (ASCII)', [ 'grep', '-anw', pat, en, ], env=GREP_ASCII), Command('rg', ['rg', '-nw', pat, en]), Command('grep', ['grep', '-anw', pat, en], env=GREP_UNICODE), ]) def bench_subtitles_en_alternate(suite_dir): ''' Benchmark the speed of a set of alternate literals. ''' require(suite_dir, 'subtitles-en') en = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_EN_NAME_SAMPLE) pat = '|'.join([ 'Sherlock Holmes', 'John Watson', 'Irene Adler', 'Inspector Lestrade', 'Professor Moriarty', ]) return Benchmark(pattern=pat, commands=[ Command('rg (lines)', ['rg', '-n', pat, en]), Command('ag (lines)', ['ag', '-s', pat, en]), Command('ucg (lines)', ['ucg', '--nosmart-case', pat, en]), Command('grep (lines)', [ 'grep', '-E', '-an', pat, en, ], env=GREP_ASCII), Command('rg', ['rg', pat, en]), Command('grep', [ 'grep', '-E', '-a', pat, en, ], env=GREP_ASCII), ]) def bench_subtitles_en_alternate_casei(suite_dir): ''' Benchmark the speed of a set of alternate literals. ''' require(suite_dir, 'subtitles-en') en = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_EN_NAME_SAMPLE) pat = '|'.join([ 'Sherlock Holmes', 'John Watson', 'Irene Adler', 'Inspector Lestrade', 'Professor Moriarty', ]) return Benchmark(pattern=pat, commands=[ Command('ag (ASCII)', ['ag', '-s', '-i', pat, en]), Command('ucg (ASCII)', ['ucg', '-i', pat, en]), Command('grep (ASCII)', [ 'grep', '-E', '-ani', pat, en, ], env=GREP_ASCII), Command('rg', ['rg', '-n', '-i', pat, en]), Command('grep', ['grep', '-E', '-ani', pat, en], env=GREP_UNICODE), ]) def bench_subtitles_en_surrounding_words(suite_dir): ''' Benchmark a more complex regex with an inner literal. ''' require(suite_dir, 'subtitles-en') en = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_EN_NAME_SAMPLE) pat = r'\w+\s+Holmes\s+\w+' return Benchmark(pattern=pat, commands=[ Command('rg', ['rg', '-n', pat, en]), Command('grep', ['grep', '-E', '-an', pat, en], env=GREP_UNICODE), Command('rg (ASCII)', ['rg', '-n', '(?-u)' + pat, en]), Command('ag (ASCII)', ['ag', '-s', pat, en]), Command('ucg (ASCII)', ['ucg', '--nosmart-case', pat, en]), Command('grep (ASCII)', [ 'grep', '-E', '-an', pat, en, ], env=GREP_ASCII), ]) def bench_subtitles_en_no_literal(suite_dir): ''' Benchmark the speed of a regex with no literals. Note that we don't even try to run grep with Unicode support on this one. While it should eventually get the right answer, I killed it after it had already been running for two minutes and showed no signs of finishing soon. ''' require(suite_dir, 'subtitles-en') en = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_EN_NAME_SAMPLE) pat = r'\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}' return Benchmark(pattern=pat, commands=[ Command('rg', ['rg', '-n', pat, en]), Command('rg (ASCII)', ['rg', '-n', '(?-u)' + pat, en]), Command('ag (ASCII)', ['ag', '-s', pat, en]), Command('ucg (ASCII)', ['ucg', '--nosmart-case', pat, en]), Command('grep (ASCII)', [ 'grep', '-E', '-an', pat, en, ], env=GREP_ASCII), ]) def bench_subtitles_ru_literal(suite_dir): ''' Benchmark the speed of a Unicode-y string literal. ''' require(suite_dir, 'subtitles-ru') ru = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_RU_NAME) pat = 'Шерлок Холмс' # Sherlock Holmes return Benchmark(pattern=pat, commands=[ Command('rg', ['rg', pat, ru]), Command('rg (no mmap)', ['rg', '--no-mmap', pat, ru]), Command('pt', ['pt', '-N', pat, ru]), Command('sift', ['sift', pat, ru]), Command('grep', ['grep', '-a', pat, ru], env=GREP_ASCII), Command('rg (lines)', ['rg', '-n', pat, ru]), Command('ag (lines)', ['ag', '-s', pat, ru]), Command('ucg (lines)', ['ucg', '--nosmart-case', pat, ru]), Command('pt (lines)', ['pt', pat, ru]), Command('sift (lines)', ['sift', '-n', pat, ru]), Command('grep (lines)', ['grep', '-an', pat, ru], env=GREP_ASCII), ]) def bench_subtitles_ru_literal_casei(suite_dir): ''' Benchmark the speed of a Unicode-y string case insensitively. ''' require(suite_dir, 'subtitles-ru') ru = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_RU_NAME) pat = 'Шерлок Холмс' # Sherlock Holmes return Benchmark(pattern=pat, commands=[ Command('rg', ['rg', '-i', pat, ru]), Command('grep', ['grep', '-ai', pat, ru], env=GREP_UNICODE), Command('grep (ASCII)', [ 'grep', '-E', '-ai', pat, ru, ], env=GREP_ASCII), Command('rg (lines)', ['rg', '-n', '-i', pat, ru]), Command('ag (lines) (ASCII)', ['ag', '-i', pat, ru]), Command('ucg (lines) (ASCII)', ['ucg', '-i', pat, ru]), ]) def bench_subtitles_ru_literal_word(suite_dir): ''' Benchmark the speed of finding a literal inside word boundaries. ''' require(suite_dir, 'subtitles-ru') ru = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_RU_NAME) pat = 'Шерлок Холмс' # Sherlock Holmes return Benchmark(pattern=pat, commands=[ Command('rg (ASCII)', [ 'rg', '-n', r'(?-u:\b)' + pat + r'(?-u:\b)', ru, ]), Command('ag (ASCII)', ['ag', '-sw', pat, ru]), Command('ucg (ASCII)', ['ucg', '--nosmart-case', pat, ru]), Command('grep (ASCII)', [ 'grep', '-anw', pat, ru, ], env=GREP_ASCII), Command('rg', ['rg', '-nw', pat, ru]), Command('grep', ['grep', '-anw', pat, ru], env=GREP_UNICODE), ]) def bench_subtitles_ru_alternate(suite_dir): ''' Benchmark the speed of a set of alternate literals. ''' require(suite_dir, 'subtitles-ru') ru = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_RU_NAME) pat = '|'.join([ 'Шерлок Холмс', # Sherlock Holmes 'Джон Уотсон', # John Watson 'Ирен Адлер', # Irene Adler 'инспектор Лестрейд', # Inspector Lestrade 'профессор Мориарти', # Professor Moriarty ]) return Benchmark(pattern=pat, commands=[ Command('rg (lines)', ['rg', '-n', pat, ru]), Command('ag (lines)', ['ag', '-s', pat, ru]), Command('ucg (lines)', ['ucg', '--nosmart-case', pat, ru]), Command('grep (lines)', [ 'grep', '-E', '-an', pat, ru, ], env=GREP_ASCII), Command('rg', ['rg', pat, ru]), Command('grep', [ 'grep', '-E', '-a', pat, ru, ], env=GREP_ASCII), ]) def bench_subtitles_ru_alternate_casei(suite_dir): ''' Benchmark the speed of a set of alternate literals. ''' require(suite_dir, 'subtitles-ru') ru = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_RU_NAME) pat = '|'.join([ 'Шерлок Холмс', # Sherlock Holmes 'Джон Уотсон', # John Watson 'Ирен Адлер', # Irene Adler 'инспектор Лестрейд', # Inspector Lestrade 'профессор Мориарти', # Professor Moriarty ]) return Benchmark(pattern=pat, commands=[ Command('ag (ASCII)', ['ag', '-s', '-i', pat, ru]), Command('ucg (ASCII)', ['ucg', '-i', pat, ru]), Command('grep (ASCII)', [ 'grep', '-E', '-ani', pat, ru, ], env=GREP_ASCII), Command('rg', ['rg', '-n', '-i', pat, ru]), Command('grep', ['grep', '-E', '-ani', pat, ru], env=GREP_UNICODE), ]) def bench_subtitles_ru_surrounding_words(suite_dir): ''' Benchmark a more complex regex with an inner literal. ''' require(suite_dir, 'subtitles-en') ru = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_RU_NAME) pat = r'\w+\s+Холмс\s+\w+' return Benchmark(pattern=pat, commands=[ Command('rg', ['rg', '-n', pat, ru]), Command('grep', ['grep', '-E', '-an', pat, ru], env=GREP_UNICODE), Command('ag (ASCII)', ['ag', '-s', pat, ru]), Command('ucg (ASCII)', ['ucg', '--nosmart-case', pat, ru]), Command('grep (ASCII)', [ 'grep', '-E', '-an', pat, ru, ], env=GREP_ASCII), ]) def bench_subtitles_ru_no_literal(suite_dir): ''' Benchmark the speed of a regex with no literals. Note that we don't even try to run grep with Unicode support on this one. While it should eventually get the right answer, I killed it after it had already been running for two minutes and showed no signs of finishing soon. ''' require(suite_dir, 'subtitles-ru') ru = path.join(suite_dir, SUBTITLES_DIR, SUBTITLES_RU_NAME) pat = r'\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}' return Benchmark(pattern=pat, commands=[ Command('rg', ['rg', '-n', pat, ru]), Command('rg (ASCII)', ['rg', '-n', '(?-u)' + pat, ru]), Command('ag (ASCII)', ['ag', '-s', pat, ru]), Command('ucg (ASCII)', ['ucg', '--nosmart-case', pat, ru]), Command('grep (ASCII)', [ 'grep', '-E', '-an', pat, ru, ], env=GREP_ASCII), ]) class MissingDependencies(Exception): ''' A missing dependency exception. This exception occurs when running a benchmark that requires a particular corpus that isn't available. :ivar list(str) missing_names: A list of missing dependency names. These names correspond to names that can be used with the --download flag. ''' def __init__(self, missing_names): self.missing_names = missing_names def __str__(self): return 'MissingDependency(%s)' % repr(self.missing_names) class MissingCommands(Exception): ''' A missing command exception. This exception occurs when running a command in a benchmark where the command could not be found on the current system. :ivar list(str) missing_names: The names of the command binaries that could not be found. ''' def __init__(self, missing_names): self.missing_names = sorted(set(missing_names)) def __str__(self): return 'MissingCommands(%s)' % repr(self.missing_names) class Benchmark(object): ''' A single benchmark corresponding to a grouping of commands. The main purpose of a benchmark is to compare the performance characteristics of a group of commands. ''' def __init__(self, name=None, pattern=None, commands=None, warmup_count=1, count=3, line_count=True, allow_missing_commands=False, disabled_cmds=None): ''' Create a single benchmark. A single benchmark is composed of a set of commands that are benchmarked and compared against one another. A benchmark may have multiple commands that use the same search tool (but probably should have something differentiating them). The grouping of commands is a purely human driven process. By default, the output of every command is sent to /dev/null. Other types of behavior are available via the methods defined on this benchmark. :param str name: A human readable string denoting the name of this benchmark. :param str pattern: The pattern that is used in search. :param list(Command) commands: A list of commands to initialize this benchmark with. More commands may be added before running the benchmark. :param int warmup_count: The number of times to run each command before recording samples. :param int count: The number of samples to collect from each command. :param bool line_count: When set, the lines of each search are counted and included in the samples produced. :param bool allow_missing_commands: When set, if a command is missing, then the benchmark will simply skip it. :param list(str) disabled_cmds: A list of commands to skip. ''' self.name = name self.pattern = pattern self.commands = commands or [] self.warmup_count = warmup_count self.count = count self.line_count = line_count self.allow_missing_commands = allow_missing_commands self.disabled_cmds = set(disabled_cmds or []) def raise_if_missing(self): ''' Raises a MissingCommands exception if applicable. A MissingCommands exception is raised when the following criteria are met: 1) allow_missing_commands is False, and 2) at least one command in this benchmark could not be found on this system. ''' missing_commands = [] for c in self.commands: if c.binary_name in self.disabled_cmds or c.exists(): continue missing_commands.append(c.binary_name) if not self.allow_missing_commands and len(missing_commands) > 0: raise MissingCommands(missing_commands) def run(self): ''' Runs this benchmark and returns the results. :rtype: Result :raises: MissingCommands if any command doesn't exist. (Unless allow_missing_commands is enabled.) ''' self.raise_if_missing() result = Result(self) for cmd in self.commands: if cmd.binary_name in self.disabled_cmds: continue if self.allow_missing_commands and not cmd.exists(): # Skip this command if we're OK with it. continue # Do a warmup first. for _ in range(self.warmup_count): self.run_one(cmd) for _ in range(self.count): result.add(cmd, **self.run_one(cmd)) return result def run_one(self, cmd): ''' Runs the given command exactly once. Returns an object that includes the time taken by the command. If this benchmark was configured to count the number of lines returned, then the line count is also returned. :param Command cmd: The command to run. :returns: A dict with two fields, duration and line_count. The duration is in seconds, with fractional milliseconds, and is guaranteed to be available. The line_count is set to None unless line counting is enabled, in which case, it is the number of lines in the search output. :rtype: int ''' if not cmd.exists(): raise MissingCommands([cmd.cmd[0]]) cmd.kwargs['stderr'] = subprocess.DEVNULL if self.line_count: cmd.kwargs['stdout'] = subprocess.PIPE else: cmd.kwargs['stdout'] = subprocess.DEVNULL start = time.time() completed = cmd.run() end = time.time() line_count = None if self.line_count: line_count = completed.stdout.count(b'\n') return { 'duration': end - start, 'line_count': line_count, } class Result(object): ''' The result of running a benchmark. Benchmark results consist of a set of samples, where each sample corresponds to a single run of a single command in the benchmark. Various statistics can be computed from these samples such as mean and standard deviation. ''' def __init__(self, benchmark): ''' Create a new set of results, initially empty. :param Benchmarl benchmark: The benchmark that produced these results. ''' self.benchmark = benchmark self.samples = [] def add(self, cmd, duration, line_count=None): ''' Add a new sample to this result set. :param Command cmd: The command that produced this sample. :param int duration: The duration, in milliseconds, that the command took to run. :param int line_count: The number of lines in the search output. This is optional. ''' self.samples.append({ 'cmd': cmd, 'duration': duration, 'line_count': line_count, }) def fastest_sample(self): ''' Returns the fastest recorded sample. ''' return min(self.samples, key=lambda s: s['duration']) def fastest_cmd(self): ''' Returns the fastest command according to distribution. ''' means = [] for cmd in self.benchmark.commands: mean, _ = self.distribution_for(cmd) if mean is None: continue means.append((cmd, mean)) return min(means, key=lambda tup: tup[1])[0] def samples_for(self, cmd): 'Returns an iterable of samples for cmd' yield from (s for s in self.samples if s['cmd'].name == cmd.name) def line_counts_for(self, cmd): ''' Returns the line counts recorded for each command. :returns: A dictionary from command name to a set of line counts recorded. ''' return {s['line_count'] for s in self.samples_for(cmd) if s['line_count'] is not None} def distribution_for(self, cmd): ''' Returns the distribution (mean +/- std) of the given command. If there are no samples for this command (i.e., it was skipped), then return ``(None, None)``. :rtype: (float, float) :returns: A tuple containing the mean and standard deviation, in that order. ''' samples = list(s['duration'] for s in self.samples_for(cmd)) if len(samples) == 0: return None, None return statistics.mean(samples), statistics.stdev(samples) class Command(object): def __init__(self, name, cmd, *args, **kwargs): ''' Create a new command that is run as part of a benchmark. *args and **kwargs are passed directly to ``subprocess.run``. An exception to this is stdin/stdout/stderr. Output redirection is completely controlled by the benchmark harness. Trying to set them here will trigger an assert. :param str name: The human readable name of this command. This is particularly useful if the same search tool is used multiple times in the same benchmark with different arguments. :param list(str) cmd: The command to run as a list of arguments (including the command name itself). ''' assert 'stdin' not in kwargs assert 'stdout' not in kwargs assert 'stderr' not in kwargs self.name = name self.cmd = cmd self.args = args self.kwargs = kwargs def exists(self): 'Returns true if and only if this command exists.' return shutil.which(self.binary_name) is not None @property def binary_name(self): 'Return the binary name of this command.' return self.cmd[0] def run(self): ''' Runs this command and returns its status. :rtype: subprocess.CompletedProcess ''' return subprocess.run(self.cmd, *self.args, **self.kwargs) def eprint(*args, **kwargs): 'Like print, but to stderr.' kwargs['file'] = sys.stderr print(*args, **kwargs) def run_cmd(cmd, *args, **kwargs): ''' Print the command to stderr and run it. If the command fails, throw a traceback. ''' eprint('# %s' % ' '.join(cmd)) kwargs['check'] = True return subprocess.run(cmd, *args, **kwargs) def require(suite_dir, *names): ''' Declare a dependency on the given names for a benchmark. If any dependency doesn't exist, then fail with an error message. ''' errs = [] for name in names: fun_name = name.replace('-', '_') if not globals()['has_%s' % fun_name](suite_dir): errs.append(name) if len(errs) > 0: raise MissingDependencies(errs) def download_linux(suite_dir): 'Download and build the Linux kernel.' checkout_dir = path.join(suite_dir, LINUX_DIR) if not os.path.isdir(checkout_dir): # Clone from my fork so that we always get the same corpus *and* still # do a shallow clone. Shallow clones are much much cheaper than full # clones. run_cmd(['git', 'clone', '--depth', '1', LINUX_CLONE, checkout_dir]) # We want to build the kernel because the process of building it produces # a lot of junk in the repository that a search tool probably shouldn't # touch. if not os.path.exists(path.join(checkout_dir, 'vmlinux')): eprint('# Building Linux kernel...') run_cmd(['make', 'defconfig'], cwd=checkout_dir) run_cmd(['make', '-j', str(cpu_count())], cwd=checkout_dir) def has_linux(suite_dir): 'Returns true if we believe the Linux kernel is built.' checkout_dir = path.join(suite_dir, LINUX_DIR) return path.exists(path.join(checkout_dir, 'vmlinux')) def download_subtitles_en(suite_dir): 'Download and decompress English subtitles.' subtitle_dir = path.join(suite_dir, SUBTITLES_DIR) en_path_gz = path.join(subtitle_dir, SUBTITLES_EN_NAME_GZ) en_path = path.join(subtitle_dir, SUBTITLES_EN_NAME) en_path_sample = path.join(subtitle_dir, SUBTITLES_EN_NAME_SAMPLE) if not os.path.isdir(subtitle_dir): os.makedirs(subtitle_dir) if not os.path.exists(en_path): if not os.path.exists(en_path_gz): run_cmd(['curl', '-LO', SUBTITLES_EN_URL], cwd=subtitle_dir) run_cmd(['gunzip', en_path_gz]) if not os.path.exists(en_path_sample): # Get a sample roughly the same size as the Russian corpus so that # benchmarks finish in a reasonable time. with open(path.join(subtitle_dir, en_path_sample), 'wb+') as f: run_cmd( ['head', '-n', '32722372', en_path], cwd=subtitle_dir, stdout=f) def has_subtitles_en(suite_dir): 'Returns true if English subtitles have been downloaded.' subtitle_dir = path.join(suite_dir, SUBTITLES_DIR) return path.exists(path.join(subtitle_dir, SUBTITLES_EN_NAME_SAMPLE)) def download_subtitles_ru(suite_dir): 'Download and decompress Russian subtitles.' subtitle_dir = path.join(suite_dir, SUBTITLES_DIR) ru_path_gz = path.join(subtitle_dir, SUBTITLES_RU_NAME_GZ) ru_path = path.join(subtitle_dir, SUBTITLES_RU_NAME) if not os.path.isdir(subtitle_dir): os.makedirs(subtitle_dir) if not os.path.exists(ru_path): if not os.path.exists(ru_path_gz): run_cmd(['curl', '-LO', SUBTITLES_RU_URL], cwd=subtitle_dir) run_cmd(['gunzip', ru_path_gz]) def has_subtitles_ru(suite_dir): 'Returns true if Russian subtitles have been downloaded.' subtitle_dir = path.join(suite_dir, SUBTITLES_DIR) return path.exists(path.join(subtitle_dir, SUBTITLES_RU_NAME)) def download(suite_dir, choices): ''' Download choices into suite_dir. Specifically, choices specifies a list of corpora to fetch. :param str suite_dir: The directory in which to download corpora. :param list(str) choices: A list of corpora to download. Available choices are: all, linux, subtitles-en, subtitles-ru. ''' for choice in choices: if choice == 'linux': download_linux(suite_dir) elif choice == 'subtitles-en': download_subtitles_en(suite_dir) elif choice == 'subtitles-ru': download_subtitles_ru(suite_dir) elif choice == 'all': download_linux(suite_dir) download_subtitles_en(suite_dir) download_subtitles_ru(suite_dir) else: eprint('Unrecognized download choice: %s' % choice) sys.exit(1) def collect_benchmarks(suite_dir, filter_pat=None, allow_missing_commands=False, disabled_cmds=None, warmup_iter=1, bench_iter=3): ''' Return an iterable of all runnable benchmarks. :param str suite_dir: The directory containing corpora. :param str filter_pat: A single regular expression that is used to filter benchmarks by their name. When not specified, all benchmarks are run. :returns: An iterable over all runnable benchmarks. If a benchmark requires corpora that are missing, then a log message is emitted to stderr and it is not yielded. ''' for fun in sorted(globals()): if not fun.startswith('bench_'): continue name = re.sub('^bench_', '', fun) if filter_pat is not None and not re.search(filter_pat, name): continue try: benchmark = globals()[fun](suite_dir) benchmark.name = name benchmark.warmup_count = warmup_iter benchmark.count = bench_iter benchmark.allow_missing_commands = allow_missing_commands benchmark.disabled_cmds = disabled_cmds benchmark.raise_if_missing() except MissingDependencies as e: eprint( 'missing: %s, skipping benchmark %s (try running with: %s)' % ( ', '.join(e.missing_names), name, ' '.join(['--download %s' % n for n in e.missing_names]), )) continue except MissingCommands as e: fmt = 'missing commands: %s, skipping benchmark %s ' \ '(run with --allow-missing to run incomplete benchmarks)' eprint(fmt % (', '.join(e.missing_names), name)) continue yield benchmark def main(): download_choices = ['all', 'linux', 'subtitles-en', 'subtitles-ru'] p = argparse.ArgumentParser('Command line search tool benchmark suite.') p.add_argument( '--dir', metavar='PATH', default=os.getcwd(), help='The directory in which to download data and perform searches.') p.add_argument( '--download', metavar='CORPUS', action='append', choices=download_choices, help='Download and prepare corpus data, then exit without running ' 'any benchmarks. Note that this command is intended to be ' 'idempotent. WARNING: This downloads over a gigabyte of data, ' 'and also includes building the Linux kernel. If "all" is used ' 'then the total uncompressed size is around 13 GB. ' 'Choices: %s' % ', '.join(download_choices)) p.add_argument( '--allow-missing', action='store_true', help='Permit benchmarks to run even if some commands are missing.') p.add_argument( '--disabled', help='A list of comma separated commands to skip.') p.add_argument( '-f', '--force', action='store_true', help='Overwrite existing files if there is a conflict.') p.add_argument( '--list', action='store_true', help='List available benchmarks by name.') p.add_argument( '--raw', metavar='PATH', help='Dump raw data (all samples collected) in CSV format to the ' 'file path provided.') p.add_argument( '--warmup-iter', metavar='INTEGER', type=int, default=1, help='The number of iterations to run each command before ' 'recording measurements.') p.add_argument( '--bench-iter', metavar='INTEGER', type=int, default=3, help='The number of iterations to run each command while ' 'recording measurements.') p.add_argument( 'bench', metavar='PAT', nargs='?', help='A regex pattern that will only run benchmarks that match.') args = p.parse_args() if args.list: benchmarks = collect_benchmarks( args.dir, filter_pat=args.bench, allow_missing_commands=args.allow_missing, disabled_cmds=(args.disabled or '').split(','), warmup_iter=args.warmup_iter, bench_iter=args.bench_iter) for b in benchmarks: print(b.name) sys.exit(0) if args.download is not None and len(args.download) > 0: download(args.dir, args.download) sys.exit(0) if not path.isdir(args.dir): os.makedirs(args.dir) if args.raw is not None and path.exists(args.raw) and not args.force: eprint('File %s already exists (delete it or use --force)' % args.raw) sys.exit(1) raw_handle, raw_csv_wtr = None, None if args.raw is not None: fields = [ 'benchmark', 'warmup_iter', 'iter', 'name', 'command', 'duration', 'lines', 'env', ] raw_handle = open(args.raw, 'w+') raw_csv_wtr = csv.DictWriter(raw_handle, fields) raw_csv_wtr.writerow({x: x for x in fields}) benchmarks = collect_benchmarks( args.dir, filter_pat=args.bench, allow_missing_commands=args.allow_missing, disabled_cmds=(args.disabled or '').split(','), warmup_iter=args.warmup_iter, bench_iter=args.bench_iter) for i, b in enumerate(benchmarks): result = b.run() fastest_cmd = result.fastest_cmd() fastest_sample = result.fastest_sample() max_name_len = max(len(cmd.name) for cmd in b.commands) if i > 0: print() header = '%s (pattern: %s)' % (b.name, b.pattern) print('%s\n%s' % (header, '-' * len(header))) for cmd in b.commands: name = cmd.name mean, stdev = result.distribution_for(cmd) if mean is None: # If we couldn't get a distribution for this command then # it was skipped. continue line_counts = result.line_counts_for(cmd) show_fast_cmd, show_line_counts = '', '' if fastest_cmd.name == cmd.name: show_fast_cmd = '*' if fastest_sample['cmd'].name == cmd.name: name += '*' if len(line_counts) > 0: counts = map(str, line_counts) show_line_counts = ' (lines: %s)' % ', '.join(counts) fmt = '{name:{pad}} {mean:0.3f} +/- {stdev:0.3f}{lines}{fast_cmd}' print(fmt.format( name=name, pad=max_name_len + 2, fast_cmd=show_fast_cmd, mean=mean, stdev=stdev, lines=show_line_counts)) sys.stdout.flush() if raw_csv_wtr is not None: for sample in result.samples: cmd, duration = sample['cmd'], sample['duration'] env = ' '.join(['%s=%s' % (k, v) for k, v in cmd.kwargs.get('env', {}).items()]) raw_csv_wtr.writerow({ 'benchmark': b.name, 'warmup_iter': b.warmup_count, 'iter': b.count, 'name': sample['cmd'].name, 'command': ' '.join(cmd.cmd), 'duration': duration, 'lines': sample['line_count'] or '', 'env': env, }) raw_handle.flush() if __name__ == '__main__': main() ripgrep-11.0.2/benchsuite/runs/2016-09-17-ubuntu1604-ec2/README.SETUP010064400017500000144000000041641303150153100217210ustar0000000000000000Ubuntu 16.04 HVM AMI c3.2xlarge, Xeon E5-2680, 2.8 GHz, 8 CPUs, 16 GB memory, 80 GB SSD # Generic system setup mkfs.ext4 /dev/xvdb sudo mount /dev/xvdb /mnt sudo chown ubuntu /mnt sudo apt-get update sudo apt-get install \ # for building Linux kernel make gcc bc sudo apt-get install \ # for the silver searcher automake pkg-config zlib1g-dev liblzma-dev libpcre3 libpcre3-dev sudo apt-get install \ # for Universal Code Grep libtool libpcre2-8-0 libpcre2-dev sudo apt-get install \ # for sift and the platinum searcher go # Get benchmark corpora cd /mnt mkdir /mnt/bench git clone git://github.com/BurntSushi/ripgrep cd ripgrep/benchsuite ./benchsuite --dir /mnt/bench/ --download all # takes around 15 minutes # Install search tools mkdir /mnt/bin/ ## ripgrep cd /mnt mkdir ripgrep-bin cd ripgrep-bin curl -LO 'https://github.com/BurntSushi/ripgrep/releases/download/0.1.2/ripgrep-0.1.2-x86_64-unknown-linux-musl.tar.gz' cp ripgrep-0.1.2-x86_64-unknown-linux-musl/rg /mnt/bin/ ## The Silver Searcher cd /mnt git clone git://github.com/ggreer/the_silver_searcher cd the_silver_searcher git checkout cda635 ./build.sh cp ag /mnt/bin/ ## Universal Code Grep cd /mnt git clone git://github.com/gvansickle/ucg cd ucg git checkout 487bfb autoreconf -i ./configure make cp ucg /mnt/bin/ ## The Platinum Searcher export GOPATH=/mnt/go go get github.com/monochromegane/the_platinum_searcher cd /mnt/go/src/github.com/monochromegane/the_platinum_searcher git checkout 509368 go install github.com/monochromegane/the_platinum_searcher/cmd/... cp /mnt/go/bin/pt /mnt/bin/ ## Sift export GOPATH=/mnt/go go get github.com/svent/sift cd /mnt/go/src/github.com/svent/sift git checkout 2d175c go install cp /mnt/go/bin/sift /mnt/bin/ ## 'git grep' and GNU grep They are part of the standard Ubuntu install, and are pretty recent (as of September 2016). $ git --version git version 2.7.4 $ grep --version grep (GNU grep) 2.25 # Running benchmarks export PATH="/mnt/bin:$PATH" cd /mnt/ripgrep/benchsuite ./benchsuite --dir /mnt/bench/ --raw /mnt/bench/raw.csv \ | tee /mnt/bench/summary # The above took around 30 minutes to run to completion. ripgrep-11.0.2/benchsuite/runs/2016-09-17-ubuntu1604-ec2/raw.csv010064400017500000144000001767171303150153100214660ustar0000000000000000benchmark,warmup_iter,iter,name,command,duration,lines,env linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.30042552947998047,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.3699159622192383,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2950403690338135,68, linux_alternates,1,3,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.7572166919708252,68, linux_alternates,1,3,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.7568728923797607,68, linux_alternates,1,3,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.7468714714050293,68, linux_alternates,1,3,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5062770843505859,68,LC_ALL=C linux_alternates,1,3,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.49932026863098145,68,LC_ALL=C linux_alternates,1,3,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5008277893066406,68,LC_ALL=C linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.19775605201721191,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.19699668884277344,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.19636178016662598,68, linux_alternates,1,3,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.21344256401062012,68, linux_alternates,1,3,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.21743154525756836,68, linux_alternates,1,3,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22065043449401855,68, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.31632304191589355,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.3168807029724121,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.4834277629852295,160, linux_alternates_casei,1,3,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.9558978080749512,160, linux_alternates_casei,1,3,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.9736671447753906,160, linux_alternates_casei,1,3,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.9648356437683105,160, linux_alternates_casei,1,3,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.0229439735412598,160,LC_ALL=C linux_alternates_casei,1,3,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.0214922428131104,160,LC_ALL=C linux_alternates_casei,1,3,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.022616147994995,160,LC_ALL=C linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22146987915039062,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22275280952453613,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22226715087890625,160, linux_alternates_casei,1,3,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5290391445159912,160, linux_alternates_casei,1,3,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5196049213409424,160, linux_alternates_casei,1,3,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5219125747680664,160, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.2871882915496826,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.38920140266418457,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.3668382167816162,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.6073203086853027,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.6012177467346191,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.5818352699279785,16, linux_literal,1,3,ag (ignore) (mmap),ag -s PM_RESUME,1.592775583267212,16, linux_literal,1,3,ag (ignore) (mmap),ag -s PM_RESUME,1.5901448726654053,16, linux_literal,1,3,ag (ignore) (mmap),ag -s PM_RESUME,1.586061716079712,16, linux_literal,1,3,pt (ignore),pt PM_RESUME,0.45094990730285645,16, linux_literal,1,3,pt (ignore),pt PM_RESUME,0.47065186500549316,16, linux_literal,1,3,pt (ignore),pt PM_RESUME,0.4422800540924072,16, linux_literal,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6293809413909912,16, linux_literal,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6314799785614014,16, linux_literal,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6289358139038086,16, linux_literal,1,3,git grep (ignore),git grep -I -n PM_RESUME,0.347550630569458,16,LC_ALL=C linux_literal,1,3,git grep (ignore),git grep -I -n PM_RESUME,0.345928430557251,16,LC_ALL=C linux_literal,1,3,git grep (ignore),git grep -I -n PM_RESUME,0.33939385414123535,16,LC_ALL=C linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.20830345153808594,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.34220385551452637,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.2077772617340088,16, linux_literal,1,3,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.21996808052062988,16, linux_literal,1,3,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.22822093963623047,16, linux_literal,1,3,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.21923017501831055,16, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.2988588809967041,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.5339267253875732,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.43750762939453125,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.603757381439209,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.618077278137207,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.6234121322631836,370, linux_literal_casei,1,3,ag (ignore) (mmap),ag -i PM_RESUME,1.621368646621704,370, linux_literal_casei,1,3,ag (ignore) (mmap),ag -i PM_RESUME,1.5698626041412354,370, linux_literal_casei,1,3,ag (ignore) (mmap),ag -i PM_RESUME,1.6105949878692627,370, linux_literal_casei,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.8005843162536621,370, linux_literal_casei,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.8044955730438232,370, linux_literal_casei,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.806922197341919,370, linux_literal_casei,1,3,git grep (ignore),git grep -I -n -i PM_RESUME,0.34161829948425293,370,LC_ALL=C linux_literal_casei,1,3,git grep (ignore),git grep -I -n -i PM_RESUME,0.3455958366394043,370,LC_ALL=C linux_literal_casei,1,3,git grep (ignore),git grep -I -n -i PM_RESUME,0.3493361473083496,370,LC_ALL=C linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.2149522304534912,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.21602368354797363,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.27021098136901855,370, linux_literal_casei,1,3,ucg (whitelist),ucg -i PM_RESUME,0.22747421264648438,370, linux_literal_casei,1,3,ucg (whitelist),ucg -i PM_RESUME,0.22050881385803223,370, linux_literal_casei,1,3,ucg (whitelist),ucg -i PM_RESUME,0.21217584609985352,370, linux_literal_default,1,3,rg,rg PM_RESUME,0.27482175827026367,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.2796294689178467,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.27638936042785645,16, linux_literal_default,1,3,ag,ag PM_RESUME,1.598384141921997,16, linux_literal_default,1,3,ag,ag PM_RESUME,1.5849597454071045,16, linux_literal_default,1,3,ag,ag PM_RESUME,1.6000149250030518,16, linux_literal_default,1,3,ucg,ucg PM_RESUME,0.2263963222503662,16, linux_literal_default,1,3,ucg,ucg PM_RESUME,0.21367835998535156,16, linux_literal_default,1,3,ucg,ucg PM_RESUME,0.21764111518859863,16, linux_literal_default,1,3,pt,pt PM_RESUME,0.42263340950012207,16, linux_literal_default,1,3,pt,pt PM_RESUME,0.467041015625,16, linux_literal_default,1,3,pt,pt PM_RESUME,0.42820048332214355,16, linux_literal_default,1,3,sift,sift PM_RESUME,0.33421826362609863,16, linux_literal_default,1,3,sift,sift PM_RESUME,0.35932135581970215,16, linux_literal_default,1,3,sift,sift PM_RESUME,0.3372631072998047,16, linux_literal_default,1,3,git grep,git grep PM_RESUME,0.348984956741333,16,LC_ALL=en_US.UTF-8 linux_literal_default,1,3,git grep,git grep PM_RESUME,0.34420299530029297,16,LC_ALL=en_US.UTF-8 linux_literal_default,1,3,git grep,git grep PM_RESUME,0.33880615234375,16,LC_ALL=en_US.UTF-8 linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5833027362823486,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5783836841583252,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5806806087493896,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.4163496494293213,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.4040029048919678,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.40265560150146484,490, linux_no_literal,1,3,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.3176910877227783,766, linux_no_literal,1,3,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.3504347801208496,766, linux_no_literal,1,3,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.317542552947998,766, linux_no_literal,1,3,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.821982383728027,491, linux_no_literal,1,3,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.82067561149597,491, linux_no_literal,1,3,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.626302242279053,491, linux_no_literal,1,3,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.349210023880005,490,LC_ALL=en_US.UTF-8 linux_no_literal,1,3,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.34226369857788,490,LC_ALL=en_US.UTF-8 linux_no_literal,1,3,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.340656995773315,490,LC_ALL=en_US.UTF-8 linux_no_literal,1,3,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.14680290222168,490,LC_ALL=C linux_no_literal,1,3,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.153340578079224,490,LC_ALL=C linux_no_literal,1,3,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.154819011688232,490,LC_ALL=C linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.49768829345703125,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5121400356292725,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.49718427658081055,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.38550543785095215,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.32651591300964355,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3246915340423584,419, linux_no_literal,1,3,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.128183126449585,416, linux_no_literal,1,3,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.1255216598510742,416, linux_no_literal,1,3,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.1268525123596191,416, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.36306214332580566,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.45077037811279297,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.3804624080657959,1652, linux_re_literal_suffix,1,3,ag (ignore),ag -s [A-Z]+_RESUME,1.8995850086212158,1652, linux_re_literal_suffix,1,3,ag (ignore),ag -s [A-Z]+_RESUME,1.8897662162780762,1652, linux_re_literal_suffix,1,3,ag (ignore),ag -s [A-Z]+_RESUME,1.878380537033081,1652, linux_re_literal_suffix,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,10.48949646949768,1652, linux_re_literal_suffix,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,10.289165735244751,1652, linux_re_literal_suffix,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,10.000468254089355,1652, linux_re_literal_suffix,1,3,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.1080453395843506,1652,LC_ALL=C linux_re_literal_suffix,1,3,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.10821533203125,1652,LC_ALL=C linux_re_literal_suffix,1,3,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.105595588684082,1652,LC_ALL=C linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.2073357105255127,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.20552492141723633,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.2061319351196289,1630, linux_re_literal_suffix,1,3,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.3013310432434082,1630, linux_re_literal_suffix,1,3,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.3005218505859375,1630, linux_re_literal_suffix,1,3,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.29984378814697266,1630, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.4162716865539551,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.47885966300964355,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.5135962963104248,23, linux_unicode_greek,1,3,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},7.570494651794434,23, linux_unicode_greek,1,3,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},7.790151596069336,23, linux_unicode_greek,1,3,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},7.783358812332153,23, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.4370443820953369,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.40680766105651855,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.4011569023132324,103, linux_unicode_greek_casei,1,3,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.002422809600830078,, linux_unicode_greek_casei,1,3,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.002414226531982422,, linux_unicode_greek_casei,1,3,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.002293109893798828,, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.44771265983581543,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.3006107807159424,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.3026111125946045,186, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.43827080726623535,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.2931697368621826,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.33072638511657715,174, linux_unicode_word,1,3,ag (ignore) (ASCII),ag -s \wAh,1.7645132541656494,174, linux_unicode_word,1,3,ag (ignore) (ASCII),ag -s \wAh,1.7730333805084229,174, linux_unicode_word,1,3,ag (ignore) (ASCII),ag -s \wAh,1.773383378982544,174, linux_unicode_word,1,3,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n \wAh,10.872124671936035,174, linux_unicode_word,1,3,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n \wAh,11.147738456726074,174, linux_unicode_word,1,3,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n \wAh,11.029243469238281,174, linux_unicode_word,1,3,git grep (ignore),git grep -E -I -n \wAh,13.047154664993286,186,LC_ALL=en_US.UTF-8 linux_unicode_word,1,3,git grep (ignore),git grep -E -I -n \wAh,13.025037288665771,186,LC_ALL=en_US.UTF-8 linux_unicode_word,1,3,git grep (ignore),git grep -E -I -n \wAh,13.081012487411499,186,LC_ALL=en_US.UTF-8 linux_unicode_word,1,3,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.98722767829895,174,LC_ALL=C linux_unicode_word,1,3,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.987990379333496,174,LC_ALL=C linux_unicode_word,1,3,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.988698959350586,174,LC_ALL=C linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.21961355209350586,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.2884254455566406,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.21905040740966797,180, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.23966765403747559,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.21801042556762695,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.21909880638122559,168, linux_unicode_word,1,3,ucg (ASCII),ucg --nosmart-case \wAh,0.2259504795074463,168, linux_unicode_word,1,3,ucg (ASCII),ucg --nosmart-case \wAh,0.22269177436828613,168, linux_unicode_word,1,3,ucg (ASCII),ucg --nosmart-case \wAh,0.2259974479675293,168, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.34968090057373047,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.28850769996643066,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.34809160232543945,6, linux_word,1,3,ag (ignore),ag -s -w PM_RESUME,1.6134660243988037,6, linux_word,1,3,ag (ignore),ag -s -w PM_RESUME,1.59847092628479,6, linux_word,1,3,ag (ignore),ag -s -w PM_RESUME,1.581369161605835,6, linux_word,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,7.644887208938599,6, linux_word,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,7.8782219886779785,6, linux_word,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,7.754150152206421,6, linux_word,1,3,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.34302353858947754,6,LC_ALL=C linux_word,1,3,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.33672142028808594,6,LC_ALL=C linux_word,1,3,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.35193610191345215,6,LC_ALL=C linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.33329272270202637,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.25751829147338867,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.21761608123779297,6, linux_word,1,3,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.22014284133911133,6, linux_word,1,3,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.22314929962158203,6, linux_word,1,3,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.2202434539794922,6, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.622809886932373,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6181182861328125,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6205663681030273,848, subtitles_en_alternate,1,3,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.7565691471099854,848, subtitles_en_alternate,1,3,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.7561769485473633,848, subtitles_en_alternate,1,3,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.7559969425201416,848, subtitles_en_alternate,1,3,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.4493463039398193,848, subtitles_en_alternate,1,3,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.44877028465271,848, subtitles_en_alternate,1,3,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.4433801174163818,848, subtitles_en_alternate,1,3,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4114174842834473,848,LC_ALL=C subtitles_en_alternate,1,3,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.411625862121582,848,LC_ALL=C subtitles_en_alternate,1,3,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.408623456954956,848,LC_ALL=C subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2900726795196533,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2905848026275635,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2903940677642822,848, subtitles_en_alternate,1,3,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.9546515941619873,848,LC_ALL=C subtitles_en_alternate,1,3,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.955279588699341,848,LC_ALL=C subtitles_en_alternate,1,3,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.954089403152466,848,LC_ALL=C subtitles_en_alternate_casei,1,3,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.169135332107544,862, subtitles_en_alternate_casei,1,3,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.174601078033447,862, subtitles_en_alternate_casei,1,3,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.1684675216674805,862, subtitles_en_alternate_casei,1,3,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4171736240386963,862, subtitles_en_alternate_casei,1,3,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4158167839050293,862, subtitles_en_alternate_casei,1,3,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4186513423919678,862, subtitles_en_alternate_casei,1,3,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.531639575958252,862,LC_ALL=C subtitles_en_alternate_casei,1,3,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.526550054550171,862,LC_ALL=C subtitles_en_alternate_casei,1,3,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.528509140014648,862,LC_ALL=C subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.722398281097412,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7225935459136963,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7222185134887695,862, subtitles_en_alternate_casei,1,3,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.12151837348938,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,1,3,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.119963884353638,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,1,3,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.121079683303833,862,LC_ALL=en_US.UTF-8 subtitles_en_literal,1,3,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2684764862060547,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.26811957359313965,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2684173583984375,629, subtitles_en_literal,1,3,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.435128688812256,629, subtitles_en_literal,1,3,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4362881183624268,629, subtitles_en_literal,1,3,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4399220943450928,629, subtitles_en_literal,1,3,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.32662391662597656,629, subtitles_en_literal,1,3,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3277275562286377,629, subtitles_en_literal,1,3,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.32798290252685547,629, subtitles_en_literal,1,3,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.520500659942627,629,LC_ALL=C subtitles_en_literal,1,3,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5191032886505127,629,LC_ALL=C subtitles_en_literal,1,3,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5171597003936768,629,LC_ALL=C subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.595801830291748,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5954360961914062,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5945618152618408,629, subtitles_en_literal,1,3,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7291676998138428,629, subtitles_en_literal,1,3,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.730966329574585,629, subtitles_en_literal,1,3,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.728854179382324,629, subtitles_en_literal,1,3,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.775996208190918,629, subtitles_en_literal,1,3,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7760195732116699,629, subtitles_en_literal,1,3,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7763564586639404,629, subtitles_en_literal,1,3,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.433366060256958,629, subtitles_en_literal,1,3,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4338581562042236,629, subtitles_en_literal,1,3,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.435924768447876,629, subtitles_en_literal,1,3,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7586827278137207,629, subtitles_en_literal,1,3,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7590317726135254,629, subtitles_en_literal,1,3,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.754432201385498,629, subtitles_en_literal,1,3,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9726488590240479,629,LC_ALL=C subtitles_en_literal,1,3,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9699857234954834,629,LC_ALL=C subtitles_en_literal,1,3,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9714112281799316,629,LC_ALL=C subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.36658453941345215,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3654778003692627,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.36565113067626953,642, subtitles_en_literal_casei,1,3,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.0890116691589355,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,1,3,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.08124852180481,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,1,3,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.0796849727630615,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,1,3,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6151647567749023,642,LC_ALL=C subtitles_en_literal_casei,1,3,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6141552925109863,642,LC_ALL=C subtitles_en_literal_casei,1,3,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6132988929748535,642,LC_ALL=C subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6962459087371826,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6945579051971436,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.693866491317749,642, subtitles_en_literal_casei,1,3,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.771639823913574,642, subtitles_en_literal_casei,1,3,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.772296190261841,642, subtitles_en_literal_casei,1,3,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7712018489837646,642, subtitles_en_literal_casei,1,3,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8068230152130127,642, subtitles_en_literal_casei,1,3,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.80411696434021,642, subtitles_en_literal_casei,1,3,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8038516044616699,642, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5951778888702393,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5971941947937012,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5952184200286865,629, subtitles_en_literal_word,1,3,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7292284965515137,629, subtitles_en_literal_word,1,3,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.728681802749634,629, subtitles_en_literal_word,1,3,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7315311431884766,629, subtitles_en_literal_word,1,3,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.784024715423584,629, subtitles_en_literal_word,1,3,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.780540943145752,629, subtitles_en_literal_word,1,3,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7772648334503174,629, subtitles_en_literal_word,1,3,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9744353294372559,629,LC_ALL=C subtitles_en_literal_word,1,3,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9781327247619629,629,LC_ALL=C subtitles_en_literal_word,1,3,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9798097610473633,629,LC_ALL=C subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5965189933776855,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5960156917572021,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5975723266601562,629, subtitles_en_literal_word,1,3,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9818971157073975,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,1,3,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9785251617431641,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,1,3,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.977081298828125,629,LC_ALL=en_US.UTF-8 subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7750890254974365,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.774017333984375,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.783200740814209,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.5396409034729004,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.5404820442199707,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.5400590896606445,13, subtitles_en_no_literal,1,3,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.072888612747192,48, subtitles_en_no_literal,1,3,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.075153350830078,48, subtitles_en_no_literal,1,3,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.0713791847229,48, subtitles_en_no_literal,1,3,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.734791278839111,13, subtitles_en_no_literal,1,3,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.7345263957977295,13, subtitles_en_no_literal,1,3,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.73199462890625,13, subtitles_en_no_literal,1,3,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.411367416381836,13,LC_ALL=C subtitles_en_no_literal,1,3,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.41072940826416,13,LC_ALL=C subtitles_en_no_literal,1,3,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.414730072021484,13,LC_ALL=C subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6052529811859131,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6049232482910156,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6045565605163574,317, subtitles_en_surrounding_words,1,3,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2849924564361572,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,1,3,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2837722301483154,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,1,3,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2847650051116943,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6005992889404297,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.600543737411499,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6009273529052734,317, subtitles_en_surrounding_words,1,3,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.664374113082886,323, subtitles_en_surrounding_words,1,3,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.674306869506836,323, subtitles_en_surrounding_words,1,3,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.657484769821167,323, subtitles_en_surrounding_words,1,3,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.650290012359619,317, subtitles_en_surrounding_words,1,3,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.651855707168579,317, subtitles_en_surrounding_words,1,3,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.649921417236328,317, subtitles_en_surrounding_words,1,3,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2745037078857422,317,LC_ALL=C subtitles_en_surrounding_words,1,3,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.275665521621704,317,LC_ALL=C subtitles_en_surrounding_words,1,3,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.273988962173462,317,LC_ALL=C subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.9031155109405518,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.9021081924438477,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.9028818607330322,691, subtitles_ru_alternate,1,3,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.8895978927612305,691, subtitles_ru_alternate,1,3,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.891357660293579,691, subtitles_ru_alternate,1,3,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.892467975616455,691, subtitles_ru_alternate,1,3,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.7517757415771484,691, subtitles_ru_alternate,1,3,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.7550888061523438,691, subtitles_ru_alternate,1,3,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.7555651664733887,691, subtitles_ru_alternate,1,3,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.51417875289917,691,LC_ALL=C subtitles_ru_alternate,1,3,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.512972116470337,691,LC_ALL=C subtitles_ru_alternate,1,3,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.507266521453857,691,LC_ALL=C subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.300950288772583,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.2987852096557617,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3024635314941406,691, subtitles_ru_alternate,1,3,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,7.983739137649536,691,LC_ALL=C subtitles_ru_alternate,1,3,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,7.988446950912476,691,LC_ALL=C subtitles_ru_alternate,1,3,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,7.979671478271484,691,LC_ALL=C subtitles_ru_alternate_casei,1,3,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.889382362365723,691, subtitles_ru_alternate_casei,1,3,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.902577877044678,691, subtitles_ru_alternate_casei,1,3,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.890571355819702,691, subtitles_ru_alternate_casei,1,3,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.7548162937164307,691, subtitles_ru_alternate_casei,1,3,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.747791051864624,691, subtitles_ru_alternate_casei,1,3,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.7396674156188965,691, subtitles_ru_alternate_casei,1,3,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.58053183555603,691,LC_ALL=C subtitles_ru_alternate_casei,1,3,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.594751596450806,691,LC_ALL=C subtitles_ru_alternate_casei,1,3,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.561670541763306,691,LC_ALL=C subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.833597183227539,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.831137180328369,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.830361843109131,735, subtitles_ru_alternate_casei,1,3,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.723876953125,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,1,3,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.723239183425903,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,1,3,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.722000360488892,735,LC_ALL=en_US.UTF-8 subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3252851963043213,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3270294666290283,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.32680773735046387,583, subtitles_ru_literal,1,3,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.932488679885864,583, subtitles_ru_literal,1,3,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.91330337524414,583, subtitles_ru_literal,1,3,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.911381006240845,583, subtitles_ru_literal,1,3,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.438587427139282,583, subtitles_ru_literal,1,3,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.412389755249023,583, subtitles_ru_literal,1,3,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.412444353103638,583, subtitles_ru_literal,1,3,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7865939140319824,583,LC_ALL=C subtitles_ru_literal,1,3,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7889957427978516,583,LC_ALL=C subtitles_ru_literal,1,3,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7923679351806641,583,LC_ALL=C subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9255633354187012,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9285938739776611,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9274048805236816,583, subtitles_ru_literal,1,3,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.4811036586761475,583, subtitles_ru_literal,1,3,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.4785168170928955,583, subtitles_ru_literal,1,3,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.484618186950684,583, subtitles_ru_literal,1,3,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7743628025054932,583, subtitles_ru_literal,1,3,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7731456756591797,583, subtitles_ru_literal,1,3,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7749128341674805,583, subtitles_ru_literal,1,3,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.931540250778198,583, subtitles_ru_literal,1,3,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.935162782669067,583, subtitles_ru_literal,1,3,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.949711561203003,583, subtitles_ru_literal,1,3,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.183809995651245,583, subtitles_ru_literal,1,3,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.19060492515564,583, subtitles_ru_literal,1,3,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.17626404762268,583, subtitles_ru_literal,1,3,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3023960590362549,583,LC_ALL=C subtitles_ru_literal,1,3,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.2992589473724365,583,LC_ALL=C subtitles_ru_literal,1,3,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.299330711364746,583,LC_ALL=C subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.1320264339447021,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.1323668956756592,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.1354515552520752,604, subtitles_ru_literal_casei,1,3,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.194744348526001,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,1,3,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.190656423568726,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,1,3,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.18506383895874,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,1,3,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7826528549194336,583,LC_ALL=C subtitles_ru_literal_casei,1,3,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7846219539642334,583,LC_ALL=C subtitles_ru_literal_casei,1,3,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7846999168395996,583,LC_ALL=C subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.734788179397583,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7333040237426758,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.731860637664795,604, subtitles_ru_literal_casei,1,3,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7297205924987793,, subtitles_ru_literal_casei,1,3,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7314808368682861,, subtitles_ru_literal_casei,1,3,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7289514541625977,, subtitles_ru_literal_casei,1,3,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7773914337158203,583, subtitles_ru_literal_casei,1,3,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.774536371231079,583, subtitles_ru_literal_casei,1,3,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7740859985351562,583, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3252553939819336,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.32543301582336426,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.32512736320495605,, subtitles_ru_literal_word,1,3,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7519562244415283,, subtitles_ru_literal_word,1,3,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.752692699432373,, subtitles_ru_literal_word,1,3,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7524521350860596,, subtitles_ru_literal_word,1,3,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7868170738220215,583, subtitles_ru_literal_word,1,3,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7786612510681152,583, subtitles_ru_literal_word,1,3,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.776214838027954,583, subtitles_ru_literal_word,1,3,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.303652286529541,583,LC_ALL=C subtitles_ru_literal_word,1,3,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3012151718139648,583,LC_ALL=C subtitles_ru_literal_word,1,3,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.307457685470581,583,LC_ALL=C subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9280951023101807,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9285900592803955,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9288535118103027,579, subtitles_ru_literal_word,1,3,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3026466369628906,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,1,3,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3016819953918457,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,1,3,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3006587028503418,579,LC_ALL=en_US.UTF-8 subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.895586729049683,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.914353132247925,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.902980327606201,41, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.972637891769409,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.9723849296569824,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.9723057746887207,, subtitles_ru_no_literal,1,3,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.3936586380004883,, subtitles_ru_no_literal,1,3,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.3987748622894287,, subtitles_ru_no_literal,1,3,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.393911361694336,, subtitles_ru_no_literal,1,3,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.8932065963745117,, subtitles_ru_no_literal,1,3,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.8977222442626953,, subtitles_ru_no_literal,1,3,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.893040895462036,, subtitles_ru_no_literal,1,3,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4844722747802734,,LC_ALL=C subtitles_ru_no_literal,1,3,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.485093116760254,,LC_ALL=C subtitles_ru_no_literal,1,3,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.482459306716919,,LC_ALL=C subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9564735889434814,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9561436176300049,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9558789730072021,278, subtitles_ru_surrounding_words,1,3,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6620113849639893,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,1,3,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6624438762664795,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,1,3,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6610260009765625,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,1,3,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4094629287719727,, subtitles_ru_surrounding_words,1,3,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.409822702407837,, subtitles_ru_surrounding_words,1,3,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4094691276550293,, subtitles_ru_surrounding_words,1,3,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.866976261138916,, subtitles_ru_surrounding_words,1,3,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.8666067123413086,, subtitles_ru_surrounding_words,1,3,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.865297317504883,, subtitles_ru_surrounding_words,1,3,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.602109670639038,,LC_ALL=C subtitles_ru_surrounding_words,1,3,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.598329782485962,,LC_ALL=C subtitles_ru_surrounding_words,1,3,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.5975282192230225,,LC_ALL=C ripgrep-11.0.2/benchsuite/runs/2016-09-17-ubuntu1604-ec2/summary010064400017500000144000000244171303150153100215650ustar0000000000000000linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------- rg (ignore) 0.322 +/- 0.042 (lines: 68) ag (ignore) 1.754 +/- 0.006 (lines: 68) git grep (ignore) 0.502 +/- 0.004 (lines: 68) rg (whitelist)* 0.197 +/- 0.001 (lines: 68)* ucg (whitelist) 0.217 +/- 0.004 (lines: 68) linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------------- rg (ignore) 0.372 +/- 0.096 (lines: 160) ag (ignore) 1.965 +/- 0.009 (lines: 160) git grep (ignore) 2.022 +/- 0.001 (lines: 160) rg (whitelist)* 0.222 +/- 0.001 (lines: 160)* ucg (whitelist) 0.524 +/- 0.005 (lines: 160) linux_literal (pattern: PM_RESUME) ---------------------------------- rg (ignore) 0.348 +/- 0.054 (lines: 16) rg (ignore) (mmap) 1.597 +/- 0.013 (lines: 16) ag (ignore) (mmap) 1.590 +/- 0.003 (lines: 16) pt (ignore) 0.455 +/- 0.015 (lines: 16) sift (ignore) 0.630 +/- 0.001 (lines: 16) git grep (ignore) 0.344 +/- 0.004 (lines: 16) rg (whitelist)* 0.253 +/- 0.077 (lines: 16) ucg (whitelist) 0.222 +/- 0.005 (lines: 16)* linux_literal_casei (pattern: PM_RESUME) ---------------------------------------- rg (ignore) 0.423 +/- 0.118 (lines: 370) rg (ignore) (mmap) 1.615 +/- 0.010 (lines: 370) ag (ignore) (mmap) 1.601 +/- 0.027 (lines: 370) sift (ignore) 0.804 +/- 0.003 (lines: 370) git grep (ignore) 0.346 +/- 0.004 (lines: 370) rg (whitelist) 0.234 +/- 0.032 (lines: 370) ucg (whitelist)* 0.220 +/- 0.008 (lines: 370)* linux_literal_default (pattern: PM_RESUME) ------------------------------------------ rg 0.277 +/- 0.002 (lines: 16) ag 1.594 +/- 0.008 (lines: 16) ucg* 0.219 +/- 0.007 (lines: 16)* pt 0.439 +/- 0.024 (lines: 16) sift 0.344 +/- 0.014 (lines: 16) git grep 0.344 +/- 0.005 (lines: 16) linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ----------------------------------------------------------------- rg (ignore) 0.581 +/- 0.002 (lines: 490) rg (ignore) (ASCII) 0.408 +/- 0.008 (lines: 490) ag (ignore) (ASCII) 2.329 +/- 0.019 (lines: 766) sift (ignore) (ASCII) 25.756 +/- 0.113 (lines: 491) git grep (ignore) 26.344 +/- 0.005 (lines: 490) git grep (ignore) (ASCII) 4.152 +/- 0.004 (lines: 490) rg (whitelist) 0.502 +/- 0.008 (lines: 419) rg (whitelist) (ASCII)* 0.346 +/- 0.035 (lines: 419)* ucg (whitelist) (ASCII) 1.127 +/- 0.001 (lines: 416) linux_re_literal_suffix (pattern: [A-Z]+_RESUME) ------------------------------------------------ rg (ignore) 0.398 +/- 0.046 (lines: 1652) ag (ignore) 1.889 +/- 0.011 (lines: 1652) sift (ignore) 10.260 +/- 0.246 (lines: 1652) git grep (ignore) 1.107 +/- 0.001 (lines: 1652) rg (whitelist)* 0.206 +/- 0.001 (lines: 1630)* ucg (whitelist) 0.301 +/- 0.001 (lines: 1630) linux_unicode_greek (pattern: \p{Greek}) ---------------------------------------- rg* 0.470 +/- 0.049 (lines: 23)* sift 7.715 +/- 0.125 (lines: 23) linux_unicode_greek_casei (pattern: \p{Greek}) ---------------------------------------------- rg 0.415 +/- 0.019 (lines: 103) sift* 0.002 +/- 0.000 (lines: 0)* linux_unicode_word (pattern: \wAh) ---------------------------------- rg (ignore) 0.350 +/- 0.084 (lines: 186) rg (ignore) (ASCII) 0.354 +/- 0.075 (lines: 174) ag (ignore) (ASCII) 1.770 +/- 0.005 (lines: 174) sift (ignore) (ASCII) 11.016 +/- 0.138 (lines: 174) git grep (ignore) 13.051 +/- 0.028 (lines: 186) git grep (ignore) (ASCII) 2.988 +/- 0.001 (lines: 174) rg (whitelist) 0.242 +/- 0.040 (lines: 180) rg (whitelist) (ASCII)* 0.226 +/- 0.012 (lines: 168) ucg (ASCII) 0.225 +/- 0.002 (lines: 168)* linux_word (pattern: PM_RESUME) ------------------------------- rg (ignore) 0.329 +/- 0.035 (lines: 6) ag (ignore) 1.598 +/- 0.016 (lines: 6) sift (ignore) 7.759 +/- 0.117 (lines: 6) git grep (ignore) 0.344 +/- 0.008 (lines: 6) rg (whitelist)* 0.269 +/- 0.059 (lines: 6) ucg (whitelist) 0.221 +/- 0.002 (lines: 6)* subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------- rg (lines) 0.620 +/- 0.002 (lines: 848) ag (lines) 3.756 +/- 0.000 (lines: 848) ucg (lines) 1.447 +/- 0.003 (lines: 848) grep (lines) 3.411 +/- 0.002 (lines: 848) rg* 0.290 +/- 0.000 (lines: 848)* grep 2.955 +/- 0.001 (lines: 848) subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------------- ag (ASCII) 5.171 +/- 0.003 (lines: 862) ucg (ASCII) 3.417 +/- 0.001 (lines: 862) grep (ASCII) 4.529 +/- 0.003 (lines: 862) rg* 2.722 +/- 0.000 (lines: 862)* grep 5.121 +/- 0.001 (lines: 862) subtitles_en_literal (pattern: Sherlock Holmes) ----------------------------------------------- rg* 0.268 +/- 0.000 (lines: 629)* pt 3.437 +/- 0.003 (lines: 629) sift 0.327 +/- 0.001 (lines: 629) grep 0.519 +/- 0.002 (lines: 629) rg (lines) 0.595 +/- 0.001 (lines: 629) ag (lines) 2.730 +/- 0.001 (lines: 629) ucg (lines) 0.776 +/- 0.000 (lines: 629) pt (lines) 3.434 +/- 0.001 (lines: 629) sift (lines) 0.757 +/- 0.003 (lines: 629) grep (lines) 0.971 +/- 0.001 (lines: 629) subtitles_en_literal_casei (pattern: Sherlock Holmes) ----------------------------------------------------- rg* 0.366 +/- 0.001 (lines: 642)* grep 4.083 +/- 0.005 (lines: 642) grep (ASCII) 0.614 +/- 0.001 (lines: 642) rg (lines) 0.695 +/- 0.001 (lines: 642) ag (lines) (ASCII) 2.772 +/- 0.001 (lines: 642) ucg (lines) (ASCII) 0.805 +/- 0.002 (lines: 642) subtitles_en_literal_word (pattern: Sherlock Holmes) ---------------------------------------------------- rg (ASCII)* 0.596 +/- 0.001 (lines: 629)* ag (ASCII) 2.730 +/- 0.002 (lines: 629) ucg (ASCII) 0.781 +/- 0.003 (lines: 629) grep (ASCII) 0.977 +/- 0.003 (lines: 629) rg 0.597 +/- 0.001 (lines: 629) grep 0.979 +/- 0.002 (lines: 629) subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 2.777 +/- 0.005 (lines: 13) rg (ASCII)* 2.540 +/- 0.000 (lines: 13)* ag (ASCII) 10.073 +/- 0.002 (lines: 48) ucg (ASCII) 7.734 +/- 0.002 (lines: 13) grep (ASCII) 4.412 +/- 0.002 (lines: 13) subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+) ------------------------------------------------------------ rg 0.605 +/- 0.000 (lines: 317) grep 1.285 +/- 0.001 (lines: 317) rg (ASCII)* 0.601 +/- 0.000 (lines: 317)* ag (ASCII) 11.665 +/- 0.008 (lines: 323) ucg (ASCII) 4.651 +/- 0.001 (lines: 317) grep (ASCII) 1.275 +/- 0.001 (lines: 317) subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------- rg (lines) 1.903 +/- 0.001 (lines: 691) ag (lines) 5.891 +/- 0.001 (lines: 691) ucg (lines) 2.754 +/- 0.002 (lines: 691) grep (lines) 8.511 +/- 0.004 (lines: 691) rg* 1.301 +/- 0.002 (lines: 691)* grep 7.984 +/- 0.004 (lines: 691) subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------------- ag (ASCII) 5.894 +/- 0.007 (lines: 691) ucg (ASCII)* 2.747 +/- 0.008 (lines: 691)* grep (ASCII) 8.579 +/- 0.017 (lines: 691) rg 4.832 +/- 0.002 (lines: 735) grep 8.723 +/- 0.001 (lines: 735) subtitles_ru_literal (pattern: Шерлок Холмс) -------------------------------------------- rg* 0.326 +/- 0.001 (lines: 583)* pt 12.919 +/- 0.012 (lines: 583) sift 16.421 +/- 0.015 (lines: 583) grep 0.789 +/- 0.003 (lines: 583) rg (lines) 0.927 +/- 0.002 (lines: 583) ag (lines) 4.481 +/- 0.003 (lines: 583) ucg (lines) 1.774 +/- 0.001 (lines: 583) pt (lines) 12.939 +/- 0.010 (lines: 583) sift (lines) 17.184 +/- 0.007 (lines: 583) grep (lines) 1.300 +/- 0.002 (lines: 583) subtitles_ru_literal_casei (pattern: Шерлок Холмс) -------------------------------------------------- rg 1.133 +/- 0.002 (lines: 604) grep 8.190 +/- 0.005 (lines: 604) grep (ASCII) 0.784 +/- 0.001 (lines: 583) rg (lines) 1.733 +/- 0.001 (lines: 604) ag (lines) (ASCII)* 0.730 +/- 0.001 (lines: 0)* ucg (lines) (ASCII) 1.775 +/- 0.002 (lines: 583) subtitles_ru_literal_word (pattern: Шерлок Холмс) ------------------------------------------------- rg (ASCII)* 0.325 +/- 0.000 (lines: 0)* ag (ASCII) 0.752 +/- 0.000 (lines: 0) ucg (ASCII) 1.781 +/- 0.006 (lines: 583) grep (ASCII) 1.304 +/- 0.003 (lines: 583) rg 0.929 +/- 0.000 (lines: 579) grep 1.302 +/- 0.001 (lines: 579) subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 4.904 +/- 0.009 (lines: 41) rg (ASCII) 3.972 +/- 0.000 (lines: 0) ag (ASCII)* 2.395 +/- 0.003 (lines: 0)* ucg (ASCII) 2.895 +/- 0.003 (lines: 0) grep (ASCII) 2.484 +/- 0.001 (lines: 0) subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+) ----------------------------------------------------------- rg* 0.956 +/- 0.000 (lines: 278)* grep 1.662 +/- 0.001 (lines: 278) ag (ASCII) 2.410 +/- 0.000 (lines: 0) ucg (ASCII) 2.866 +/- 0.001 (lines: 0) grep (ASCII) 1.599 +/- 0.002 (lines: 0) ripgrep-11.0.2/benchsuite/runs/2016-09-20-ubuntu1604-ec2/README.SETUP010064400017500000144000000041741303150153100217140ustar0000000000000000Ubuntu 16.04 HVM AMI c3.2xlarge, Xeon E5-2680, 2.8 GHz, 8 CPUs, 16 GB memory, 80 GB SSD # Generic system setup mkfs.ext4 /dev/xvdb sudo mount /dev/xvdb /mnt sudo chown ubuntu /mnt sudo apt-get update sudo apt-get install \ # for building Linux kernel make gcc bc sudo apt-get install \ # for the silver searcher automake pkg-config zlib1g-dev liblzma-dev libpcre3 libpcre3-dev sudo apt-get install \ # for Universal Code Grep libtool libpcre2-8-0 libpcre2-dev sudo apt-get install \ # for sift and the platinum searcher go # Get benchmark corpora cd /mnt mkdir /mnt/bench git clone git://github.com/BurntSushi/ripgrep cd ripgrep/benchsuite ./benchsuite --dir /mnt/bench/ --download all # takes around 15 minutes # Install search tools mkdir /mnt/bin/ ## ripgrep cd /mnt mkdir ripgrep-bin cd ripgrep-bin curl -LO 'https://github.com/BurntSushi/ripgrep/releases/download/0.1.2/ripgrep-0.1.2-x86_64-unknown-linux-musl.tar.gz' cp ripgrep-0.1.2-x86_64-unknown-linux-musl/rg /mnt/bin/ ## The Silver Searcher cd /mnt git clone git://github.com/ggreer/the_silver_searcher cd the_silver_searcher git checkout cda635 ./build.sh cp ag /mnt/bin/ ## Universal Code Grep cd /mnt git clone git://github.com/gvansickle/ucg cd ucg git checkout 487bfb autoreconf -i ./configure make cp ucg /mnt/bin/ ## The Platinum Searcher export GOPATH=/mnt/go go get github.com/monochromegane/the_platinum_searcher cd /mnt/go/src/github.com/monochromegane/the_platinum_searcher git checkout 509368 go install github.com/monochromegane/the_platinum_searcher/cmd/... cp /mnt/go/bin/pt /mnt/bin/ ## Sift export GOPATH=/mnt/go go get github.com/svent/sift cd /mnt/go/src/github.com/svent/sift git checkout 2d175c go install cp /mnt/go/bin/sift /mnt/bin/ ## 'git grep' and GNU grep They are part of the standard Ubuntu install, and are pretty recent (as of September 2016). $ git --version git version 2.7.4 $ grep --version grep (GNU grep) 2.25 # Running benchmarks export PATH="/mnt/bin:$PATH" cd /mnt/ripgrep/benchsuite ./benchsuite \ --dir /mnt/bench/ --raw /mnt/bench/raw.csv --warmup-iter 3 --bench-iter 10 # The above took around 120 minutes to run to completion. ripgrep-11.0.2/benchsuite/runs/2016-09-20-ubuntu1604-ec2/raw.csv010064400017500000144000006726261303150153100214600ustar0000000000000000benchmark,warmup_iter,iter,name,command,duration,lines,env linux_alternates,3,10,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.47386884689331055,68, linux_alternates,3,10,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.4676964282989502,68, linux_alternates,3,10,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2977464199066162,68, linux_alternates,3,10,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.404477596282959,68, linux_alternates,3,10,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.29970765113830566,68, linux_alternates,3,10,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2981560230255127,68, linux_alternates,3,10,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.29827141761779785,68, linux_alternates,3,10,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2970547676086426,68, linux_alternates,3,10,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.37766170501708984,68, linux_alternates,3,10,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2981750965118408,68, linux_alternates,3,10,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.745070219039917,68, linux_alternates,3,10,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.743051290512085,68, linux_alternates,3,10,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.7471156120300293,68, linux_alternates,3,10,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.7482519149780273,68, linux_alternates,3,10,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.7504711151123047,68, linux_alternates,3,10,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.7388739585876465,68, linux_alternates,3,10,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.751807451248169,68, linux_alternates,3,10,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.7407019138336182,68, linux_alternates,3,10,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.7513477802276611,68, linux_alternates,3,10,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.7503643035888672,68, linux_alternates,3,10,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.4976229667663574,68,LC_ALL=C linux_alternates,3,10,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5058624744415283,68,LC_ALL=C linux_alternates,3,10,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5003554821014404,68,LC_ALL=C linux_alternates,3,10,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5036265850067139,68,LC_ALL=C linux_alternates,3,10,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.502265453338623,68,LC_ALL=C linux_alternates,3,10,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5051944255828857,68,LC_ALL=C linux_alternates,3,10,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.49764204025268555,68,LC_ALL=C linux_alternates,3,10,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5026199817657471,68,LC_ALL=C linux_alternates,3,10,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.500784158706665,68,LC_ALL=C linux_alternates,3,10,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.4986872673034668,68,LC_ALL=C linux_alternates,3,10,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.19666719436645508,68, linux_alternates,3,10,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.20122385025024414,68, linux_alternates,3,10,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2921123504638672,68, linux_alternates,3,10,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.19991230964660645,68, linux_alternates,3,10,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.20190691947937012,68, linux_alternates,3,10,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.23188090324401855,68, linux_alternates,3,10,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2041609287261963,68, linux_alternates,3,10,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.19266295433044434,68, linux_alternates,3,10,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.24373841285705566,68, linux_alternates,3,10,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.19818353652954102,68, linux_alternates,3,10,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.21015572547912598,68, linux_alternates,3,10,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22674226760864258,68, linux_alternates,3,10,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.21504473686218262,68, linux_alternates,3,10,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22454237937927246,68, linux_alternates,3,10,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2039196491241455,68, linux_alternates,3,10,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2037363052368164,68, linux_alternates,3,10,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.20755791664123535,68, linux_alternates,3,10,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.21857881546020508,68, linux_alternates,3,10,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2158210277557373,68, linux_alternates,3,10,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.213883638381958,68, linux_alternates_casei,3,10,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5118546485900879,160, linux_alternates_casei,3,10,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.4563937187194824,160, linux_alternates_casei,3,10,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.3091299533843994,160, linux_alternates_casei,3,10,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.3657255172729492,160, linux_alternates_casei,3,10,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.31900572776794434,160, linux_alternates_casei,3,10,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.31780076026916504,160, linux_alternates_casei,3,10,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.4655437469482422,160, linux_alternates_casei,3,10,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.4731638431549072,160, linux_alternates_casei,3,10,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.31702089309692383,160, linux_alternates_casei,3,10,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.37751269340515137,160, linux_alternates_casei,3,10,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.9786202907562256,160, linux_alternates_casei,3,10,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.9616754055023193,160, linux_alternates_casei,3,10,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.982335090637207,160, linux_alternates_casei,3,10,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.9551584720611572,160, linux_alternates_casei,3,10,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.9577994346618652,160, linux_alternates_casei,3,10,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.971240758895874,160, linux_alternates_casei,3,10,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.9659252166748047,160, linux_alternates_casei,3,10,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.968651294708252,160, linux_alternates_casei,3,10,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.974630355834961,160, linux_alternates_casei,3,10,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.9673101902008057,160, linux_alternates_casei,3,10,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.0195815563201904,160,LC_ALL=C linux_alternates_casei,3,10,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.014780044555664,160,LC_ALL=C linux_alternates_casei,3,10,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.0152857303619385,160,LC_ALL=C linux_alternates_casei,3,10,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.021533727645874,160,LC_ALL=C linux_alternates_casei,3,10,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.008901596069336,160,LC_ALL=C linux_alternates_casei,3,10,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.017594575881958,160,LC_ALL=C linux_alternates_casei,3,10,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.030247449874878,160,LC_ALL=C linux_alternates_casei,3,10,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.0156710147857666,160,LC_ALL=C linux_alternates_casei,3,10,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.0224251747131348,160,LC_ALL=C linux_alternates_casei,3,10,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,2.01462459564209,160,LC_ALL=C linux_alternates_casei,3,10,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22264957427978516,160, linux_alternates_casei,3,10,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22289133071899414,160, linux_alternates_casei,3,10,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22011518478393555,160, linux_alternates_casei,3,10,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22271180152893066,160, linux_alternates_casei,3,10,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22096776962280273,160, linux_alternates_casei,3,10,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22350811958312988,160, linux_alternates_casei,3,10,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22304296493530273,160, linux_alternates_casei,3,10,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.22333812713623047,160, linux_alternates_casei,3,10,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2226696014404297,160, linux_alternates_casei,3,10,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2225027084350586,160, linux_alternates_casei,3,10,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5201499462127686,160, linux_alternates_casei,3,10,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5199308395385742,160, linux_alternates_casei,3,10,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5204341411590576,160, linux_alternates_casei,3,10,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5242149829864502,160, linux_alternates_casei,3,10,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5222067832946777,160, linux_alternates_casei,3,10,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5239078998565674,160, linux_alternates_casei,3,10,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5225164890289307,160, linux_alternates_casei,3,10,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5211355686187744,160, linux_alternates_casei,3,10,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.521998405456543,160, linux_alternates_casei,3,10,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5194001197814941,160, linux_literal,3,10,rg (ignore),rg -n PM_RESUME,0.2887847423553467,16, linux_literal,3,10,rg (ignore),rg -n PM_RESUME,0.33100366592407227,16, linux_literal,3,10,rg (ignore),rg -n PM_RESUME,0.29135560989379883,16, linux_literal,3,10,rg (ignore),rg -n PM_RESUME,0.35103440284729004,16, linux_literal,3,10,rg (ignore),rg -n PM_RESUME,0.28871941566467285,16, linux_literal,3,10,rg (ignore),rg -n PM_RESUME,0.41626620292663574,16, linux_literal,3,10,rg (ignore),rg -n PM_RESUME,0.4109630584716797,16, linux_literal,3,10,rg (ignore),rg -n PM_RESUME,0.28783345222473145,16, linux_literal,3,10,rg (ignore),rg -n PM_RESUME,0.2896847724914551,16, linux_literal,3,10,rg (ignore),rg -n PM_RESUME,0.3816063404083252,16, linux_literal,3,10,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.6185925006866455,16, linux_literal,3,10,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.6278767585754395,16, linux_literal,3,10,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.6153473854064941,16, linux_literal,3,10,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.6009879112243652,16, linux_literal,3,10,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.6033079624176025,16, linux_literal,3,10,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.597747564315796,16, linux_literal,3,10,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.6077642440795898,16, linux_literal,3,10,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.6068522930145264,16, linux_literal,3,10,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.6185357570648193,16, linux_literal,3,10,rg (ignore) (mmap),rg -n --mmap PM_RESUME,1.6097495555877686,16, linux_literal,3,10,ag (ignore) (mmap),ag -s PM_RESUME,1.5874614715576172,16, linux_literal,3,10,ag (ignore) (mmap),ag -s PM_RESUME,1.6032404899597168,16, linux_literal,3,10,ag (ignore) (mmap),ag -s PM_RESUME,1.5708537101745605,16, linux_literal,3,10,ag (ignore) (mmap),ag -s PM_RESUME,1.5849754810333252,16, linux_literal,3,10,ag (ignore) (mmap),ag -s PM_RESUME,1.5937259197235107,16, linux_literal,3,10,ag (ignore) (mmap),ag -s PM_RESUME,1.5755681991577148,16, linux_literal,3,10,ag (ignore) (mmap),ag -s PM_RESUME,1.606102705001831,16, linux_literal,3,10,ag (ignore) (mmap),ag -s PM_RESUME,1.5942778587341309,16, linux_literal,3,10,ag (ignore) (mmap),ag -s PM_RESUME,1.5798444747924805,16, linux_literal,3,10,ag (ignore) (mmap),ag -s PM_RESUME,1.587292194366455,16, linux_literal,3,10,pt (ignore),pt PM_RESUME,0.48366618156433105,16, linux_literal,3,10,pt (ignore),pt PM_RESUME,0.43807315826416016,16, linux_literal,3,10,pt (ignore),pt PM_RESUME,0.4620192050933838,16, linux_literal,3,10,pt (ignore),pt PM_RESUME,0.4109156131744385,16, linux_literal,3,10,pt (ignore),pt PM_RESUME,0.4734470844268799,16, linux_literal,3,10,pt (ignore),pt PM_RESUME,0.4730203151702881,16, linux_literal,3,10,pt (ignore),pt PM_RESUME,0.46596622467041016,16, linux_literal,3,10,pt (ignore),pt PM_RESUME,0.43018555641174316,16, linux_literal,3,10,pt (ignore),pt PM_RESUME,0.48219823837280273,16, linux_literal,3,10,pt (ignore),pt PM_RESUME,0.43694376945495605,16, linux_literal,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6309304237365723,16, linux_literal,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6273376941680908,16, linux_literal,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6281638145446777,16, linux_literal,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6282968521118164,16, linux_literal,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6298778057098389,16, linux_literal,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6303853988647461,16, linux_literal,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6214172840118408,16, linux_literal,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6326169967651367,16, linux_literal,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6357946395874023,16, linux_literal,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.6349425315856934,16, linux_literal,3,10,git grep (ignore),git grep -I -n PM_RESUME,0.3352987766265869,16,LC_ALL=C linux_literal,3,10,git grep (ignore),git grep -I -n PM_RESUME,0.34267115592956543,16,LC_ALL=C linux_literal,3,10,git grep (ignore),git grep -I -n PM_RESUME,0.33582019805908203,16,LC_ALL=C linux_literal,3,10,git grep (ignore),git grep -I -n PM_RESUME,0.3533494472503662,16,LC_ALL=C linux_literal,3,10,git grep (ignore),git grep -I -n PM_RESUME,0.35305285453796387,16,LC_ALL=C linux_literal,3,10,git grep (ignore),git grep -I -n PM_RESUME,0.35210490226745605,16,LC_ALL=C linux_literal,3,10,git grep (ignore),git grep -I -n PM_RESUME,0.3439147472381592,16,LC_ALL=C linux_literal,3,10,git grep (ignore),git grep -I -n PM_RESUME,0.3385200500488281,16,LC_ALL=C linux_literal,3,10,git grep (ignore),git grep -I -n PM_RESUME,0.34418511390686035,16,LC_ALL=C linux_literal,3,10,git grep (ignore),git grep -I -n PM_RESUME,0.351276159286499,16,LC_ALL=C linux_literal,3,10,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.21218633651733398,16, linux_literal,3,10,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.2074875831604004,16, linux_literal,3,10,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.2121737003326416,16, linux_literal,3,10,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.29766225814819336,16, linux_literal,3,10,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.20844221115112305,16, linux_literal,3,10,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.21107196807861328,16, linux_literal,3,10,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.3164327144622803,16, linux_literal,3,10,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.2020113468170166,16, linux_literal,3,10,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.21297645568847656,16, linux_literal,3,10,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.20153403282165527,16, linux_literal,3,10,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.21353983879089355,16, linux_literal,3,10,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.20673179626464844,16, linux_literal,3,10,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.21759939193725586,16, linux_literal,3,10,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.2182610034942627,16, linux_literal,3,10,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.21338224411010742,16, linux_literal,3,10,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.2172555923461914,16, linux_literal,3,10,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.2167196273803711,16, linux_literal,3,10,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.22050833702087402,16, linux_literal,3,10,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.22791433334350586,16, linux_literal,3,10,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.22888803482055664,16, linux_literal_casei,3,10,rg (ignore),rg -n -i PM_RESUME,0.3006107807159424,370, linux_literal_casei,3,10,rg (ignore),rg -n -i PM_RESUME,0.300311803817749,370, linux_literal_casei,3,10,rg (ignore),rg -n -i PM_RESUME,0.29694652557373047,370, linux_literal_casei,3,10,rg (ignore),rg -n -i PM_RESUME,0.41213250160217285,370, linux_literal_casei,3,10,rg (ignore),rg -n -i PM_RESUME,0.2940239906311035,370, linux_literal_casei,3,10,rg (ignore),rg -n -i PM_RESUME,0.5161991119384766,370, linux_literal_casei,3,10,rg (ignore),rg -n -i PM_RESUME,0.38535594940185547,370, linux_literal_casei,3,10,rg (ignore),rg -n -i PM_RESUME,0.3468937873840332,370, linux_literal_casei,3,10,rg (ignore),rg -n -i PM_RESUME,0.3020455837249756,370, linux_literal_casei,3,10,rg (ignore),rg -n -i PM_RESUME,0.2997910976409912,370, linux_literal_casei,3,10,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.6084694862365723,370, linux_literal_casei,3,10,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.606147289276123,370, linux_literal_casei,3,10,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.62626051902771,370, linux_literal_casei,3,10,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.6127331256866455,370, linux_literal_casei,3,10,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.6354174613952637,370, linux_literal_casei,3,10,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.6024584770202637,370, linux_literal_casei,3,10,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.611799716949463,370, linux_literal_casei,3,10,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.5951638221740723,370, linux_literal_casei,3,10,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.6110625267028809,370, linux_literal_casei,3,10,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,1.61025071144104,370, linux_literal_casei,3,10,ag (ignore) (mmap),ag -i PM_RESUME,1.61818528175354,370, linux_literal_casei,3,10,ag (ignore) (mmap),ag -i PM_RESUME,1.6345157623291016,370, linux_literal_casei,3,10,ag (ignore) (mmap),ag -i PM_RESUME,1.5905261039733887,370, linux_literal_casei,3,10,ag (ignore) (mmap),ag -i PM_RESUME,1.6204230785369873,370, linux_literal_casei,3,10,ag (ignore) (mmap),ag -i PM_RESUME,1.5921993255615234,370, linux_literal_casei,3,10,ag (ignore) (mmap),ag -i PM_RESUME,1.5896248817443848,370, linux_literal_casei,3,10,ag (ignore) (mmap),ag -i PM_RESUME,1.6044423580169678,370, linux_literal_casei,3,10,ag (ignore) (mmap),ag -i PM_RESUME,1.611330509185791,370, linux_literal_casei,3,10,ag (ignore) (mmap),ag -i PM_RESUME,1.6240627765655518,370, linux_literal_casei,3,10,ag (ignore) (mmap),ag -i PM_RESUME,1.6050136089324951,370, linux_literal_casei,3,10,pt (ignore),pt -i PM_RESUME,17.215137004852295,370, linux_literal_casei,3,10,pt (ignore),pt -i PM_RESUME,17.027225255966187,370, linux_literal_casei,3,10,pt (ignore),pt -i PM_RESUME,17.218045234680176,370, linux_literal_casei,3,10,pt (ignore),pt -i PM_RESUME,17.382962942123413,370, linux_literal_casei,3,10,pt (ignore),pt -i PM_RESUME,17.16927456855774,370, linux_literal_casei,3,10,pt (ignore),pt -i PM_RESUME,17.348739862442017,370, linux_literal_casei,3,10,pt (ignore),pt -i PM_RESUME,17.116779565811157,370, linux_literal_casei,3,10,pt (ignore),pt -i PM_RESUME,17.035597562789917,370, linux_literal_casei,3,10,pt (ignore),pt -i PM_RESUME,17.179709911346436,370, linux_literal_casei,3,10,pt (ignore),pt -i PM_RESUME,17.351134777069092,370, linux_literal_casei,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.7961351871490479,370, linux_literal_casei,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.8030610084533691,370, linux_literal_casei,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.803156852722168,370, linux_literal_casei,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.8085391521453857,370, linux_literal_casei,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.8109989166259766,370, linux_literal_casei,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.8001055717468262,370, linux_literal_casei,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.8120794296264648,370, linux_literal_casei,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.8061761856079102,370, linux_literal_casei,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.8085212707519531,370, linux_literal_casei,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.7987847328186035,370, linux_literal_casei,3,10,git grep (ignore),git grep -I -n -i PM_RESUME,0.34406495094299316,370,LC_ALL=C linux_literal_casei,3,10,git grep (ignore),git grep -I -n -i PM_RESUME,0.3358898162841797,370,LC_ALL=C linux_literal_casei,3,10,git grep (ignore),git grep -I -n -i PM_RESUME,0.3549189567565918,370,LC_ALL=C linux_literal_casei,3,10,git grep (ignore),git grep -I -n -i PM_RESUME,0.3384251594543457,370,LC_ALL=C linux_literal_casei,3,10,git grep (ignore),git grep -I -n -i PM_RESUME,0.34453749656677246,370,LC_ALL=C linux_literal_casei,3,10,git grep (ignore),git grep -I -n -i PM_RESUME,0.34092092514038086,370,LC_ALL=C linux_literal_casei,3,10,git grep (ignore),git grep -I -n -i PM_RESUME,0.3376765251159668,370,LC_ALL=C linux_literal_casei,3,10,git grep (ignore),git grep -I -n -i PM_RESUME,0.34916138648986816,370,LC_ALL=C linux_literal_casei,3,10,git grep (ignore),git grep -I -n -i PM_RESUME,0.33722376823425293,370,LC_ALL=C linux_literal_casei,3,10,git grep (ignore),git grep -I -n -i PM_RESUME,0.3521549701690674,370,LC_ALL=C linux_literal_casei,3,10,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.22751879692077637,370, linux_literal_casei,3,10,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.2776045799255371,370, linux_literal_casei,3,10,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.21505451202392578,370, linux_literal_casei,3,10,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.21794772148132324,370, linux_literal_casei,3,10,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.21863842010498047,370, linux_literal_casei,3,10,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.20025348663330078,370, linux_literal_casei,3,10,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.21541285514831543,370, linux_literal_casei,3,10,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.21509718894958496,370, linux_literal_casei,3,10,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.21069550514221191,370, linux_literal_casei,3,10,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.21798276901245117,370, linux_literal_casei,3,10,ucg (whitelist),ucg -i PM_RESUME,0.21774601936340332,370, linux_literal_casei,3,10,ucg (whitelist),ucg -i PM_RESUME,0.20911478996276855,370, linux_literal_casei,3,10,ucg (whitelist),ucg -i PM_RESUME,0.22953128814697266,370, linux_literal_casei,3,10,ucg (whitelist),ucg -i PM_RESUME,0.20992112159729004,370, linux_literal_casei,3,10,ucg (whitelist),ucg -i PM_RESUME,0.2173295021057129,370, linux_literal_casei,3,10,ucg (whitelist),ucg -i PM_RESUME,0.22140860557556152,370, linux_literal_casei,3,10,ucg (whitelist),ucg -i PM_RESUME,0.2150726318359375,370, linux_literal_casei,3,10,ucg (whitelist),ucg -i PM_RESUME,0.22086834907531738,370, linux_literal_casei,3,10,ucg (whitelist),ucg -i PM_RESUME,0.21045351028442383,370, linux_literal_casei,3,10,ucg (whitelist),ucg -i PM_RESUME,0.22116923332214355,370, linux_literal_default,3,10,rg,rg PM_RESUME,0.547431468963623,16, linux_literal_default,3,10,rg,rg PM_RESUME,0.2980644702911377,16, linux_literal_default,3,10,rg,rg PM_RESUME,0.2759268283843994,16, linux_literal_default,3,10,rg,rg PM_RESUME,0.47458386421203613,16, linux_literal_default,3,10,rg,rg PM_RESUME,0.31407952308654785,16, linux_literal_default,3,10,rg,rg PM_RESUME,0.27758288383483887,16, linux_literal_default,3,10,rg,rg PM_RESUME,0.4621877670288086,16, linux_literal_default,3,10,rg,rg PM_RESUME,0.2774538993835449,16, linux_literal_default,3,10,rg,rg PM_RESUME,0.2882564067840576,16, linux_literal_default,3,10,rg,rg PM_RESUME,0.27521324157714844,16, linux_literal_default,3,10,ag,ag PM_RESUME,1.5812609195709229,16, linux_literal_default,3,10,ag,ag PM_RESUME,1.6005668640136719,16, linux_literal_default,3,10,ag,ag PM_RESUME,1.5730962753295898,16, linux_literal_default,3,10,ag,ag PM_RESUME,1.592977523803711,16, linux_literal_default,3,10,ag,ag PM_RESUME,1.5821592807769775,16, linux_literal_default,3,10,ag,ag PM_RESUME,1.5887324810028076,16, linux_literal_default,3,10,ag,ag PM_RESUME,1.5817389488220215,16, linux_literal_default,3,10,ag,ag PM_RESUME,1.594618558883667,16, linux_literal_default,3,10,ag,ag PM_RESUME,1.5992517471313477,16, linux_literal_default,3,10,ag,ag PM_RESUME,1.596695899963379,16, linux_literal_default,3,10,ucg,ucg PM_RESUME,0.21654176712036133,16, linux_literal_default,3,10,ucg,ucg PM_RESUME,0.21590709686279297,16, linux_literal_default,3,10,ucg,ucg PM_RESUME,0.2110304832458496,16, linux_literal_default,3,10,ucg,ucg PM_RESUME,0.21798467636108398,16, linux_literal_default,3,10,ucg,ucg PM_RESUME,0.23079442977905273,16, linux_literal_default,3,10,ucg,ucg PM_RESUME,0.2108612060546875,16, linux_literal_default,3,10,ucg,ucg PM_RESUME,0.22725200653076172,16, linux_literal_default,3,10,ucg,ucg PM_RESUME,0.21680736541748047,16, linux_literal_default,3,10,ucg,ucg PM_RESUME,0.21963763236999512,16, linux_literal_default,3,10,ucg,ucg PM_RESUME,0.20926284790039062,16, linux_literal_default,3,10,pt,pt PM_RESUME,0.46857309341430664,16, linux_literal_default,3,10,pt,pt PM_RESUME,0.47760438919067383,16, linux_literal_default,3,10,pt,pt PM_RESUME,0.46701765060424805,16, linux_literal_default,3,10,pt,pt PM_RESUME,0.4331653118133545,16, linux_literal_default,3,10,pt,pt PM_RESUME,0.45867037773132324,16, linux_literal_default,3,10,pt,pt PM_RESUME,0.4557461738586426,16, linux_literal_default,3,10,pt,pt PM_RESUME,0.46278929710388184,16, linux_literal_default,3,10,pt,pt PM_RESUME,0.4585258960723877,16, linux_literal_default,3,10,pt,pt PM_RESUME,0.47124767303466797,16, linux_literal_default,3,10,pt,pt PM_RESUME,0.4672355651855469,16, linux_literal_default,3,10,sift,sift PM_RESUME,0.38060545921325684,16, linux_literal_default,3,10,sift,sift PM_RESUME,0.3329169750213623,16, linux_literal_default,3,10,sift,sift PM_RESUME,0.33484435081481934,16, linux_literal_default,3,10,sift,sift PM_RESUME,0.35355401039123535,16, linux_literal_default,3,10,sift,sift PM_RESUME,0.35204195976257324,16, linux_literal_default,3,10,sift,sift PM_RESUME,0.338015079498291,16, linux_literal_default,3,10,sift,sift PM_RESUME,0.33859682083129883,16, linux_literal_default,3,10,sift,sift PM_RESUME,0.37181973457336426,16, linux_literal_default,3,10,sift,sift PM_RESUME,0.34308838844299316,16, linux_literal_default,3,10,sift,sift PM_RESUME,0.37679576873779297,16, linux_literal_default,3,10,git grep,git grep PM_RESUME,0.34804248809814453,16,LC_ALL=en_US.UTF-8 linux_literal_default,3,10,git grep,git grep PM_RESUME,0.3415200710296631,16,LC_ALL=en_US.UTF-8 linux_literal_default,3,10,git grep,git grep PM_RESUME,0.33733463287353516,16,LC_ALL=en_US.UTF-8 linux_literal_default,3,10,git grep,git grep PM_RESUME,0.3332488536834717,16,LC_ALL=en_US.UTF-8 linux_literal_default,3,10,git grep,git grep PM_RESUME,0.34481191635131836,16,LC_ALL=en_US.UTF-8 linux_literal_default,3,10,git grep,git grep PM_RESUME,0.34947681427001953,16,LC_ALL=en_US.UTF-8 linux_literal_default,3,10,git grep,git grep PM_RESUME,0.34740161895751953,16,LC_ALL=en_US.UTF-8 linux_literal_default,3,10,git grep,git grep PM_RESUME,0.33948254585266113,16,LC_ALL=en_US.UTF-8 linux_literal_default,3,10,git grep,git grep PM_RESUME,0.3381669521331787,16,LC_ALL=en_US.UTF-8 linux_literal_default,3,10,git grep,git grep PM_RESUME,0.34292149543762207,16,LC_ALL=en_US.UTF-8 linux_no_literal,3,10,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5793054103851318,490, linux_no_literal,3,10,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5733230113983154,490, linux_no_literal,3,10,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5830531120300293,490, linux_no_literal,3,10,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5784716606140137,490, linux_no_literal,3,10,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5747678279876709,490, linux_no_literal,3,10,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5774915218353271,490, linux_no_literal,3,10,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5772106647491455,490, linux_no_literal,3,10,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.576981782913208,490, linux_no_literal,3,10,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5727875232696533,490, linux_no_literal,3,10,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5777604579925537,490, linux_no_literal,3,10,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.47701001167297363,490, linux_no_literal,3,10,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.4056098461151123,490, linux_no_literal,3,10,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.40029191970825195,490, linux_no_literal,3,10,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.4043698310852051,490, linux_no_literal,3,10,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.39755749702453613,490, linux_no_literal,3,10,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.40610837936401367,490, linux_no_literal,3,10,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.40239667892456055,490, linux_no_literal,3,10,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.44395995140075684,490, linux_no_literal,3,10,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.41157984733581543,490, linux_no_literal,3,10,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.40621185302734375,490, linux_no_literal,3,10,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.346493721008301,766, linux_no_literal,3,10,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.3504796028137207,766, linux_no_literal,3,10,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.337827682495117,766, linux_no_literal,3,10,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.3482706546783447,766, linux_no_literal,3,10,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.321526288986206,766, linux_no_literal,3,10,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.3464548587799072,766, linux_no_literal,3,10,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.3376870155334473,766, linux_no_literal,3,10,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.337705612182617,766, linux_no_literal,3,10,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.328770637512207,766, linux_no_literal,3,10,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.3303186893463135,766, linux_no_literal,3,10,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},22.04857587814331,490, linux_no_literal,3,10,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},22.10808300971985,490, linux_no_literal,3,10,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},22.033851861953735,490, linux_no_literal,3,10,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},22.140597581863403,490, linux_no_literal,3,10,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},22.119322299957275,490, linux_no_literal,3,10,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},21.98818349838257,490, linux_no_literal,3,10,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},21.977314949035645,490, linux_no_literal,3,10,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},22.06201982498169,490, linux_no_literal,3,10,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},22.061450242996216,490, linux_no_literal,3,10,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},22.124264001846313,490, linux_no_literal,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.59274411201477,490, linux_no_literal,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.573359489440918,490, linux_no_literal,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.742077112197876,490, linux_no_literal,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.54994797706604,490, linux_no_literal,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.706160306930542,490, linux_no_literal,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.445934057235718,490, linux_no_literal,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.45766806602478,490, linux_no_literal,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.43312954902649,490, linux_no_literal,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.491786241531372,490, linux_no_literal,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},25.634543895721436,490, linux_no_literal,3,10,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.399667501449585,490,LC_ALL=en_US.UTF-8 linux_no_literal,3,10,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.38280701637268,490,LC_ALL=en_US.UTF-8 linux_no_literal,3,10,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.41436266899109,490,LC_ALL=en_US.UTF-8 linux_no_literal,3,10,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.356714010238647,490,LC_ALL=en_US.UTF-8 linux_no_literal,3,10,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.372775316238403,490,LC_ALL=en_US.UTF-8 linux_no_literal,3,10,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.366456031799316,490,LC_ALL=en_US.UTF-8 linux_no_literal,3,10,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.345572233200073,490,LC_ALL=en_US.UTF-8 linux_no_literal,3,10,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.359038591384888,490,LC_ALL=en_US.UTF-8 linux_no_literal,3,10,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.339266777038574,490,LC_ALL=en_US.UTF-8 linux_no_literal,3,10,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},26.48772692680359,490,LC_ALL=en_US.UTF-8 linux_no_literal,3,10,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.16526985168457,490,LC_ALL=C linux_no_literal,3,10,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.1695733070373535,490,LC_ALL=C linux_no_literal,3,10,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.155884027481079,490,LC_ALL=C linux_no_literal,3,10,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.143868684768677,490,LC_ALL=C linux_no_literal,3,10,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.147655248641968,490,LC_ALL=C linux_no_literal,3,10,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.151846885681152,490,LC_ALL=C linux_no_literal,3,10,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.140476703643799,490,LC_ALL=C linux_no_literal,3,10,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.142986059188843,490,LC_ALL=C linux_no_literal,3,10,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.156916379928589,490,LC_ALL=C linux_no_literal,3,10,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},4.157176971435547,490,LC_ALL=C linux_no_literal,3,10,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5112531185150146,419, linux_no_literal,3,10,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5284323692321777,419, linux_no_literal,3,10,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.49768805503845215,419, linux_no_literal,3,10,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.4940907955169678,419, linux_no_literal,3,10,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.5072541236877441,419, linux_no_literal,3,10,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.50177001953125,419, linux_no_literal,3,10,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.494765043258667,419, linux_no_literal,3,10,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.49721837043762207,419, linux_no_literal,3,10,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.49683475494384766,419, linux_no_literal,3,10,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.4985806941986084,419, linux_no_literal,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3259718418121338,419, linux_no_literal,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.32500338554382324,419, linux_no_literal,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.32590746879577637,419, linux_no_literal,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3270235061645508,419, linux_no_literal,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.40813469886779785,419, linux_no_literal,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3254811763763428,419, linux_no_literal,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.32666945457458496,419, linux_no_literal,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.42030978202819824,419, linux_no_literal,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3227384090423584,419, linux_no_literal,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3258059024810791,419, linux_no_literal,3,10,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.132291555404663,416, linux_no_literal,3,10,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.1314997673034668,416, linux_no_literal,3,10,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.129917860031128,416, linux_no_literal,3,10,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.1349639892578125,416, linux_no_literal,3,10,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.1323256492614746,416, linux_no_literal,3,10,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.1280417442321777,416, linux_no_literal,3,10,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.128892183303833,416, linux_no_literal,3,10,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.12849760055542,416, linux_no_literal,3,10,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.128230094909668,416, linux_no_literal,3,10,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.126936435699463,416, linux_re_literal_suffix,3,10,rg (ignore),rg -n [A-Z]+_RESUME,0.2936074733734131,1652, linux_re_literal_suffix,3,10,rg (ignore),rg -n [A-Z]+_RESUME,0.28904199600219727,1652, linux_re_literal_suffix,3,10,rg (ignore),rg -n [A-Z]+_RESUME,0.35044193267822266,1652, linux_re_literal_suffix,3,10,rg (ignore),rg -n [A-Z]+_RESUME,0.33156752586364746,1652, linux_re_literal_suffix,3,10,rg (ignore),rg -n [A-Z]+_RESUME,0.2898244857788086,1652, linux_re_literal_suffix,3,10,rg (ignore),rg -n [A-Z]+_RESUME,0.28866147994995117,1652, linux_re_literal_suffix,3,10,rg (ignore),rg -n [A-Z]+_RESUME,0.39086151123046875,1652, linux_re_literal_suffix,3,10,rg (ignore),rg -n [A-Z]+_RESUME,0.2908496856689453,1652, linux_re_literal_suffix,3,10,rg (ignore),rg -n [A-Z]+_RESUME,0.3271830081939697,1652, linux_re_literal_suffix,3,10,rg (ignore),rg -n [A-Z]+_RESUME,0.3252100944519043,1652, linux_re_literal_suffix,3,10,ag (ignore),ag -s [A-Z]+_RESUME,1.8963699340820312,1652, linux_re_literal_suffix,3,10,ag (ignore),ag -s [A-Z]+_RESUME,1.8861753940582275,1652, linux_re_literal_suffix,3,10,ag (ignore),ag -s [A-Z]+_RESUME,1.8948850631713867,1652, linux_re_literal_suffix,3,10,ag (ignore),ag -s [A-Z]+_RESUME,1.9025893211364746,1652, linux_re_literal_suffix,3,10,ag (ignore),ag -s [A-Z]+_RESUME,1.9024877548217773,1652, linux_re_literal_suffix,3,10,ag (ignore),ag -s [A-Z]+_RESUME,1.916628122329712,1652, linux_re_literal_suffix,3,10,ag (ignore),ag -s [A-Z]+_RESUME,1.895963430404663,1652, linux_re_literal_suffix,3,10,ag (ignore),ag -s [A-Z]+_RESUME,1.8982641696929932,1652, linux_re_literal_suffix,3,10,ag (ignore),ag -s [A-Z]+_RESUME,1.906947135925293,1652, linux_re_literal_suffix,3,10,ag (ignore),ag -s [A-Z]+_RESUME,1.8928930759429932,1652, linux_re_literal_suffix,3,10,pt (ignore),pt -e [A-Z]+_RESUME,13.542996168136597,1652, linux_re_literal_suffix,3,10,pt (ignore),pt -e [A-Z]+_RESUME,13.356479167938232,1652, linux_re_literal_suffix,3,10,pt (ignore),pt -e [A-Z]+_RESUME,14.192973136901855,1652, linux_re_literal_suffix,3,10,pt (ignore),pt -e [A-Z]+_RESUME,13.541444063186646,1652, linux_re_literal_suffix,3,10,pt (ignore),pt -e [A-Z]+_RESUME,13.854554653167725,1652, linux_re_literal_suffix,3,10,pt (ignore),pt -e [A-Z]+_RESUME,13.603343725204468,1652, linux_re_literal_suffix,3,10,pt (ignore),pt -e [A-Z]+_RESUME,13.799452781677246,1652, linux_re_literal_suffix,3,10,pt (ignore),pt -e [A-Z]+_RESUME,13.863913774490356,1652, linux_re_literal_suffix,3,10,pt (ignore),pt -e [A-Z]+_RESUME,13.838748455047607,1652, linux_re_literal_suffix,3,10,pt (ignore),pt -e [A-Z]+_RESUME,13.538004636764526,1652, linux_re_literal_suffix,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,10.060765504837036,1652, linux_re_literal_suffix,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,10.49359679222107,1652, linux_re_literal_suffix,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,10.081884145736694,1652, linux_re_literal_suffix,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,10.493861675262451,1652, linux_re_literal_suffix,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,10.067906379699707,1652, linux_re_literal_suffix,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,9.981789588928223,1652, linux_re_literal_suffix,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,10.265925168991089,1652, linux_re_literal_suffix,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,10.045130014419556,1652, linux_re_literal_suffix,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,10.06310224533081,1652, linux_re_literal_suffix,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,10.161619186401367,1652, linux_re_literal_suffix,3,10,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.1039769649505615,1652,LC_ALL=C linux_re_literal_suffix,3,10,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.114553689956665,1652,LC_ALL=C linux_re_literal_suffix,3,10,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.1093242168426514,1652,LC_ALL=C linux_re_literal_suffix,3,10,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.1064682006835938,1652,LC_ALL=C linux_re_literal_suffix,3,10,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.1018595695495605,1652,LC_ALL=C linux_re_literal_suffix,3,10,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.109755516052246,1652,LC_ALL=C linux_re_literal_suffix,3,10,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.1123108863830566,1652,LC_ALL=C linux_re_literal_suffix,3,10,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.1048264503479004,1652,LC_ALL=C linux_re_literal_suffix,3,10,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.109236478805542,1652,LC_ALL=C linux_re_literal_suffix,3,10,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,1.10935640335083,1652,LC_ALL=C linux_re_literal_suffix,3,10,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.20705485343933105,1630, linux_re_literal_suffix,3,10,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.2106492519378662,1630, linux_re_literal_suffix,3,10,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.2084188461303711,1630, linux_re_literal_suffix,3,10,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.2640719413757324,1630, linux_re_literal_suffix,3,10,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.2081773281097412,1630, linux_re_literal_suffix,3,10,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.2118208408355713,1630, linux_re_literal_suffix,3,10,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.2089850902557373,1630, linux_re_literal_suffix,3,10,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.23274970054626465,1630, linux_re_literal_suffix,3,10,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.25668978691101074,1630, linux_re_literal_suffix,3,10,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.20613741874694824,1630, linux_re_literal_suffix,3,10,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.30318307876586914,1630, linux_re_literal_suffix,3,10,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.2986927032470703,1630, linux_re_literal_suffix,3,10,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.2998936176300049,1630, linux_re_literal_suffix,3,10,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.3013923168182373,1630, linux_re_literal_suffix,3,10,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.3002176284790039,1630, linux_re_literal_suffix,3,10,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.29929661750793457,1630, linux_re_literal_suffix,3,10,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.3002638816833496,1630, linux_re_literal_suffix,3,10,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.3022594451904297,1630, linux_re_literal_suffix,3,10,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.3005950450897217,1630, linux_re_literal_suffix,3,10,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.3003072738647461,1630, linux_unicode_greek,3,10,rg,rg -n \p{Greek},0.4220447540283203,23, linux_unicode_greek,3,10,rg,rg -n \p{Greek},0.4022982120513916,23, linux_unicode_greek,3,10,rg,rg -n \p{Greek},0.40406036376953125,23, linux_unicode_greek,3,10,rg,rg -n \p{Greek},0.414935827255249,23, linux_unicode_greek,3,10,rg,rg -n \p{Greek},0.39977121353149414,23, linux_unicode_greek,3,10,rg,rg -n \p{Greek},0.4032399654388428,23, linux_unicode_greek,3,10,rg,rg -n \p{Greek},0.4270012378692627,23, linux_unicode_greek,3,10,rg,rg -n \p{Greek},0.4013488292694092,23, linux_unicode_greek,3,10,rg,rg -n \p{Greek},0.46738338470458984,23, linux_unicode_greek,3,10,rg,rg -n \p{Greek},0.4026005268096924,23, linux_unicode_greek,3,10,pt,pt -e \p{Greek},12.682367086410522,23, linux_unicode_greek,3,10,pt,pt -e \p{Greek},12.691372394561768,23, linux_unicode_greek,3,10,pt,pt -e \p{Greek},12.737368822097778,23, linux_unicode_greek,3,10,pt,pt -e \p{Greek},12.813798666000366,23, linux_unicode_greek,3,10,pt,pt -e \p{Greek},12.881911754608154,23, linux_unicode_greek,3,10,pt,pt -e \p{Greek},12.321162462234497,23, linux_unicode_greek,3,10,pt,pt -e \p{Greek},12.792261838912964,23, linux_unicode_greek,3,10,pt,pt -e \p{Greek},12.894794464111328,23, linux_unicode_greek,3,10,pt,pt -e \p{Greek},12.860591650009155,23, linux_unicode_greek,3,10,pt,pt -e \p{Greek},12.774003744125366,23, linux_unicode_greek,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},7.338077068328857,23, linux_unicode_greek,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},7.741130113601685,23, linux_unicode_greek,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},7.807847023010254,23, linux_unicode_greek,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},7.8104469776153564,23, linux_unicode_greek,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},7.743628978729248,23, linux_unicode_greek,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},7.728483438491821,23, linux_unicode_greek,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},8.222429275512695,23, linux_unicode_greek,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},8.043334722518921,23, linux_unicode_greek,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},7.848775863647461,23, linux_unicode_greek,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},7.382145643234253,23, linux_unicode_greek_casei,3,10,rg,rg -n -i \p{Greek},0.4646949768066406,103, linux_unicode_greek_casei,3,10,rg,rg -n -i \p{Greek},0.40577101707458496,103, linux_unicode_greek_casei,3,10,rg,rg -n -i \p{Greek},0.39434385299682617,103, linux_unicode_greek_casei,3,10,rg,rg -n -i \p{Greek},0.42445874214172363,103, linux_unicode_greek_casei,3,10,rg,rg -n -i \p{Greek},0.4024500846862793,103, linux_unicode_greek_casei,3,10,rg,rg -n -i \p{Greek},0.41817784309387207,103, linux_unicode_greek_casei,3,10,rg,rg -n -i \p{Greek},0.41820359230041504,103, linux_unicode_greek_casei,3,10,rg,rg -n -i \p{Greek},0.4578087329864502,103, linux_unicode_greek_casei,3,10,rg,rg -n -i \p{Greek},0.4002723693847656,103, linux_unicode_greek_casei,3,10,rg,rg -n -i \p{Greek},0.460965633392334,103, linux_unicode_greek_casei,3,10,pt,pt -i -e \p{Greek},12.604194641113281,23, linux_unicode_greek_casei,3,10,pt,pt -i -e \p{Greek},12.585155010223389,23, linux_unicode_greek_casei,3,10,pt,pt -i -e \p{Greek},12.904623985290527,23, linux_unicode_greek_casei,3,10,pt,pt -i -e \p{Greek},12.603661298751831,23, linux_unicode_greek_casei,3,10,pt,pt -i -e \p{Greek},12.89511752128601,23, linux_unicode_greek_casei,3,10,pt,pt -i -e \p{Greek},12.375482320785522,23, linux_unicode_greek_casei,3,10,pt,pt -i -e \p{Greek},12.77438759803772,23, linux_unicode_greek_casei,3,10,pt,pt -i -e \p{Greek},12.416762113571167,23, linux_unicode_greek_casei,3,10,pt,pt -i -e \p{Greek},12.711334705352783,23, linux_unicode_greek_casei,3,10,pt,pt -i -e \p{Greek},12.253499746322632,23, linux_unicode_greek_casei,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.0025110244750976562,, linux_unicode_greek_casei,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.002439260482788086,, linux_unicode_greek_casei,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.0024383068084716797,, linux_unicode_greek_casei,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.0023565292358398438,, linux_unicode_greek_casei,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.0022935867309570312,, linux_unicode_greek_casei,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.0023267269134521484,, linux_unicode_greek_casei,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.002335071563720703,, linux_unicode_greek_casei,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.0022766590118408203,, linux_unicode_greek_casei,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.002285003662109375,, linux_unicode_greek_casei,3,10,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.002235889434814453,, linux_unicode_word,3,10,rg (ignore),rg -n \wAh,0.5075342655181885,186, linux_unicode_word,3,10,rg (ignore),rg -n \wAh,0.3014566898345947,186, linux_unicode_word,3,10,rg (ignore),rg -n \wAh,0.30255842208862305,186, linux_unicode_word,3,10,rg (ignore),rg -n \wAh,0.419527530670166,186, linux_unicode_word,3,10,rg (ignore),rg -n \wAh,0.30051612854003906,186, linux_unicode_word,3,10,rg (ignore),rg -n \wAh,0.41606736183166504,186, linux_unicode_word,3,10,rg (ignore),rg -n \wAh,0.3061816692352295,186, linux_unicode_word,3,10,rg (ignore),rg -n \wAh,0.316450834274292,186, linux_unicode_word,3,10,rg (ignore),rg -n \wAh,0.29686737060546875,186, linux_unicode_word,3,10,rg (ignore),rg -n \wAh,0.3846714496612549,186, linux_unicode_word,3,10,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.30101466178894043,174, linux_unicode_word,3,10,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.29622554779052734,174, linux_unicode_word,3,10,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.3100159168243408,174, linux_unicode_word,3,10,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.30087780952453613,174, linux_unicode_word,3,10,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.29802870750427246,174, linux_unicode_word,3,10,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.4232194423675537,174, linux_unicode_word,3,10,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.45890188217163086,174, linux_unicode_word,3,10,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.2998533248901367,174, linux_unicode_word,3,10,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.29979395866394043,174, linux_unicode_word,3,10,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.2986025810241699,174, linux_unicode_word,3,10,ag (ignore) (ASCII),ag -s \wAh,1.7579238414764404,174, linux_unicode_word,3,10,ag (ignore) (ASCII),ag -s \wAh,1.7875633239746094,174, linux_unicode_word,3,10,ag (ignore) (ASCII),ag -s \wAh,1.7632112503051758,174, linux_unicode_word,3,10,ag (ignore) (ASCII),ag -s \wAh,1.7843427658081055,174, linux_unicode_word,3,10,ag (ignore) (ASCII),ag -s \wAh,1.7860534191131592,174, linux_unicode_word,3,10,ag (ignore) (ASCII),ag -s \wAh,1.7815673351287842,174, linux_unicode_word,3,10,ag (ignore) (ASCII),ag -s \wAh,1.7678496837615967,174, linux_unicode_word,3,10,ag (ignore) (ASCII),ag -s \wAh,1.7820045948028564,174, linux_unicode_word,3,10,ag (ignore) (ASCII),ag -s \wAh,1.7667298316955566,174, linux_unicode_word,3,10,ag (ignore) (ASCII),ag -s \wAh,1.765808343887329,174, linux_unicode_word,3,10,pt (ignore) (ASCII),pt -e \wAh,14.26370882987976,174, linux_unicode_word,3,10,pt (ignore) (ASCII),pt -e \wAh,13.948208808898926,174, linux_unicode_word,3,10,pt (ignore) (ASCII),pt -e \wAh,14.321836948394775,174, linux_unicode_word,3,10,pt (ignore) (ASCII),pt -e \wAh,14.353292226791382,174, linux_unicode_word,3,10,pt (ignore) (ASCII),pt -e \wAh,13.980775117874146,174, linux_unicode_word,3,10,pt (ignore) (ASCII),pt -e \wAh,14.000723600387573,174, linux_unicode_word,3,10,pt (ignore) (ASCII),pt -e \wAh,14.369597673416138,174, linux_unicode_word,3,10,pt (ignore) (ASCII),pt -e \wAh,13.967730045318604,174, linux_unicode_word,3,10,pt (ignore) (ASCII),pt -e \wAh,14.324349164962769,174, linux_unicode_word,3,10,pt (ignore) (ASCII),pt -e \wAh,14.270223140716553,174, linux_unicode_word,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,11.162141561508179,174, linux_unicode_word,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,10.980525970458984,174, linux_unicode_word,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,11.026103496551514,174, linux_unicode_word,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,11.277002811431885,174, linux_unicode_word,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,11.148287057876587,174, linux_unicode_word,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,11.005484819412231,174, linux_unicode_word,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,10.91290545463562,174, linux_unicode_word,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,11.106207847595215,174, linux_unicode_word,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,11.16712760925293,174, linux_unicode_word,3,10,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,11.083898544311523,174, linux_unicode_word,3,10,git grep (ignore),git grep -E -I -n \wAh,13.044305801391602,186,LC_ALL=en_US.UTF-8 linux_unicode_word,3,10,git grep (ignore),git grep -E -I -n \wAh,13.056626081466675,186,LC_ALL=en_US.UTF-8 linux_unicode_word,3,10,git grep (ignore),git grep -E -I -n \wAh,13.048550844192505,186,LC_ALL=en_US.UTF-8 linux_unicode_word,3,10,git grep (ignore),git grep -E -I -n \wAh,13.029039859771729,186,LC_ALL=en_US.UTF-8 linux_unicode_word,3,10,git grep (ignore),git grep -E -I -n \wAh,13.047250509262085,186,LC_ALL=en_US.UTF-8 linux_unicode_word,3,10,git grep (ignore),git grep -E -I -n \wAh,13.04845643043518,186,LC_ALL=en_US.UTF-8 linux_unicode_word,3,10,git grep (ignore),git grep -E -I -n \wAh,13.051046133041382,186,LC_ALL=en_US.UTF-8 linux_unicode_word,3,10,git grep (ignore),git grep -E -I -n \wAh,13.03917121887207,186,LC_ALL=en_US.UTF-8 linux_unicode_word,3,10,git grep (ignore),git grep -E -I -n \wAh,13.039993047714233,186,LC_ALL=en_US.UTF-8 linux_unicode_word,3,10,git grep (ignore),git grep -E -I -n \wAh,13.041208982467651,186,LC_ALL=en_US.UTF-8 linux_unicode_word,3,10,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.9960885047912598,174,LC_ALL=C linux_unicode_word,3,10,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.985478401184082,174,LC_ALL=C linux_unicode_word,3,10,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.9874212741851807,174,LC_ALL=C linux_unicode_word,3,10,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.987626314163208,174,LC_ALL=C linux_unicode_word,3,10,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.994694471359253,174,LC_ALL=C linux_unicode_word,3,10,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.992467164993286,174,LC_ALL=C linux_unicode_word,3,10,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.9871950149536133,174,LC_ALL=C linux_unicode_word,3,10,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.995185613632202,174,LC_ALL=C linux_unicode_word,3,10,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.9936091899871826,174,LC_ALL=C linux_unicode_word,3,10,git grep (ignore) (ASCII),git grep -E -I -n \wAh,2.9940080642700195,174,LC_ALL=C linux_unicode_word,3,10,rg (whitelist),rg -n --no-ignore -tall \wAh,0.21994638442993164,180, linux_unicode_word,3,10,rg (whitelist),rg -n --no-ignore -tall \wAh,0.22097373008728027,180, linux_unicode_word,3,10,rg (whitelist),rg -n --no-ignore -tall \wAh,0.23552775382995605,180, linux_unicode_word,3,10,rg (whitelist),rg -n --no-ignore -tall \wAh,0.21982312202453613,180, linux_unicode_word,3,10,rg (whitelist),rg -n --no-ignore -tall \wAh,0.3113522529602051,180, linux_unicode_word,3,10,rg (whitelist),rg -n --no-ignore -tall \wAh,0.26632070541381836,180, linux_unicode_word,3,10,rg (whitelist),rg -n --no-ignore -tall \wAh,0.21911191940307617,180, linux_unicode_word,3,10,rg (whitelist),rg -n --no-ignore -tall \wAh,0.22008752822875977,180, linux_unicode_word,3,10,rg (whitelist),rg -n --no-ignore -tall \wAh,0.21874570846557617,180, linux_unicode_word,3,10,rg (whitelist),rg -n --no-ignore -tall \wAh,0.21397948265075684,180, linux_unicode_word,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.21848511695861816,168, linux_unicode_word,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.2182908058166504,168, linux_unicode_word,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.2177116870880127,168, linux_unicode_word,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.21211910247802734,168, linux_unicode_word,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.2223820686340332,168, linux_unicode_word,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.22381138801574707,168, linux_unicode_word,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.2192692756652832,168, linux_unicode_word,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.28908252716064453,168, linux_unicode_word,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.21803808212280273,168, linux_unicode_word,3,10,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.21266746520996094,168, linux_unicode_word,3,10,ucg (ASCII),ucg --nosmart-case \wAh,0.22500395774841309,168, linux_unicode_word,3,10,ucg (ASCII),ucg --nosmart-case \wAh,0.2196519374847412,168, linux_unicode_word,3,10,ucg (ASCII),ucg --nosmart-case \wAh,0.23636341094970703,168, linux_unicode_word,3,10,ucg (ASCII),ucg --nosmart-case \wAh,0.22854065895080566,168, linux_unicode_word,3,10,ucg (ASCII),ucg --nosmart-case \wAh,0.24159979820251465,168, linux_unicode_word,3,10,ucg (ASCII),ucg --nosmart-case \wAh,0.2279496192932129,168, linux_unicode_word,3,10,ucg (ASCII),ucg --nosmart-case \wAh,0.2282264232635498,168, linux_unicode_word,3,10,ucg (ASCII),ucg --nosmart-case \wAh,0.22038722038269043,168, linux_unicode_word,3,10,ucg (ASCII),ucg --nosmart-case \wAh,0.2304396629333496,168, linux_unicode_word,3,10,ucg (ASCII),ucg --nosmart-case \wAh,0.22999143600463867,168, linux_word,3,10,rg (ignore),rg -n -w PM_RESUME,0.4643971920013428,6, linux_word,3,10,rg (ignore),rg -n -w PM_RESUME,0.31100964546203613,6, linux_word,3,10,rg (ignore),rg -n -w PM_RESUME,0.2884225845336914,6, linux_word,3,10,rg (ignore),rg -n -w PM_RESUME,0.3069937229156494,6, linux_word,3,10,rg (ignore),rg -n -w PM_RESUME,0.29024529457092285,6, linux_word,3,10,rg (ignore),rg -n -w PM_RESUME,0.4824669361114502,6, linux_word,3,10,rg (ignore),rg -n -w PM_RESUME,0.46274733543395996,6, linux_word,3,10,rg (ignore),rg -n -w PM_RESUME,0.28812289237976074,6, linux_word,3,10,rg (ignore),rg -n -w PM_RESUME,0.350308895111084,6, linux_word,3,10,rg (ignore),rg -n -w PM_RESUME,0.374927282333374,6, linux_word,3,10,ag (ignore),ag -s -w PM_RESUME,1.6171681880950928,6, linux_word,3,10,ag (ignore),ag -s -w PM_RESUME,1.6098666191101074,6, linux_word,3,10,ag (ignore),ag -s -w PM_RESUME,1.5964553356170654,6, linux_word,3,10,ag (ignore),ag -s -w PM_RESUME,1.6071968078613281,6, linux_word,3,10,ag (ignore),ag -s -w PM_RESUME,1.5954012870788574,6, linux_word,3,10,ag (ignore),ag -s -w PM_RESUME,1.6015000343322754,6, linux_word,3,10,ag (ignore),ag -s -w PM_RESUME,1.601473331451416,6, linux_word,3,10,ag (ignore),ag -s -w PM_RESUME,1.5954999923706055,6, linux_word,3,10,ag (ignore),ag -s -w PM_RESUME,1.6129882335662842,6, linux_word,3,10,ag (ignore),ag -s -w PM_RESUME,1.588838815689087,6, linux_word,3,10,pt (ignore),pt -w PM_RESUME,14.572103500366211,6, linux_word,3,10,pt (ignore),pt -w PM_RESUME,14.43345308303833,6, linux_word,3,10,pt (ignore),pt -w PM_RESUME,14.209619045257568,6, linux_word,3,10,pt (ignore),pt -w PM_RESUME,14.430129051208496,6, linux_word,3,10,pt (ignore),pt -w PM_RESUME,14.560482263565063,6, linux_word,3,10,pt (ignore),pt -w PM_RESUME,14.483187913894653,6, linux_word,3,10,pt (ignore),pt -w PM_RESUME,14.457705020904541,6, linux_word,3,10,pt (ignore),pt -w PM_RESUME,14.179070472717285,6, linux_word,3,10,pt (ignore),pt -w PM_RESUME,14.290963411331177,6, linux_word,3,10,pt (ignore),pt -w PM_RESUME,14.554560422897339,6, linux_word,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,7.818600416183472,6, linux_word,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,7.8375983238220215,6, linux_word,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,8.135910034179688,6, linux_word,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,7.684378623962402,6, linux_word,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,7.841930389404297,6, linux_word,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,7.910590171813965,6, linux_word,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,7.786734104156494,6, linux_word,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,7.763006687164307,6, linux_word,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,7.749568223953247,6, linux_word,3,10,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,7.872854232788086,6, linux_word,3,10,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.34014463424682617,6,LC_ALL=C linux_word,3,10,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.3321688175201416,6,LC_ALL=C linux_word,3,10,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.34490489959716797,6,LC_ALL=C linux_word,3,10,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.34313368797302246,6,LC_ALL=C linux_word,3,10,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.3335700035095215,6,LC_ALL=C linux_word,3,10,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.33677148818969727,6,LC_ALL=C linux_word,3,10,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.3442800045013428,6,LC_ALL=C linux_word,3,10,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.3435385227203369,6,LC_ALL=C linux_word,3,10,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.3433525562286377,6,LC_ALL=C linux_word,3,10,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.3496122360229492,6,LC_ALL=C linux_word,3,10,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.20868396759033203,6, linux_word,3,10,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.20928955078125,6, linux_word,3,10,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.21094799041748047,6, linux_word,3,10,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.21063971519470215,6, linux_word,3,10,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.20990324020385742,6, linux_word,3,10,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.28969311714172363,6, linux_word,3,10,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.20476388931274414,6, linux_word,3,10,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.23818445205688477,6, linux_word,3,10,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.2111814022064209,6, linux_word,3,10,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.20949006080627441,6, linux_word,3,10,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.22462105751037598,6, linux_word,3,10,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.22188782691955566,6, linux_word,3,10,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.22634053230285645,6, linux_word,3,10,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.21634244918823242,6, linux_word,3,10,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.2205817699432373,6, linux_word,3,10,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.22465920448303223,6, linux_word,3,10,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.2336571216583252,6, linux_word,3,10,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.20835447311401367,6, linux_word,3,10,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.21285319328308105,6, linux_word,3,10,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.2190699577331543,6, subtitles_en_alternate,3,10,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6189219951629639,848, subtitles_en_alternate,3,10,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6190304756164551,848, subtitles_en_alternate,3,10,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6199381351470947,848, subtitles_en_alternate,3,10,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.618828296661377,848, subtitles_en_alternate,3,10,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6196391582489014,848, subtitles_en_alternate,3,10,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6181838512420654,848, subtitles_en_alternate,3,10,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6187732219696045,848, subtitles_en_alternate,3,10,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6184597015380859,848, subtitles_en_alternate,3,10,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6172432899475098,848, subtitles_en_alternate,3,10,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6174371242523193,848, subtitles_en_alternate,3,10,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.755958080291748,848, subtitles_en_alternate,3,10,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.757115602493286,848, subtitles_en_alternate,3,10,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.756659746170044,848, subtitles_en_alternate,3,10,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.755875825881958,848, subtitles_en_alternate,3,10,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.7559609413146973,848, subtitles_en_alternate,3,10,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.7556204795837402,848, subtitles_en_alternate,3,10,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.757873773574829,848, subtitles_en_alternate,3,10,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.7584357261657715,848, subtitles_en_alternate,3,10,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.7554702758789062,848, subtitles_en_alternate,3,10,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.756683111190796,848, subtitles_en_alternate,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.4781913757324219,848, subtitles_en_alternate,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.480832576751709,848, subtitles_en_alternate,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.481184959411621,848, subtitles_en_alternate,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.479053258895874,848, subtitles_en_alternate,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.4790685176849365,848, subtitles_en_alternate,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.4752089977264404,848, subtitles_en_alternate,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.479438304901123,848, subtitles_en_alternate,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.4795243740081787,848, subtitles_en_alternate,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.4814894199371338,848, subtitles_en_alternate,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.4802560806274414,848, subtitles_en_alternate,3,10,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4137959480285645,848,LC_ALL=C subtitles_en_alternate,3,10,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4180681705474854,848,LC_ALL=C subtitles_en_alternate,3,10,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4078221321105957,848,LC_ALL=C subtitles_en_alternate,3,10,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4076828956604004,848,LC_ALL=C subtitles_en_alternate,3,10,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.41274094581604,848,LC_ALL=C subtitles_en_alternate,3,10,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4122402667999268,848,LC_ALL=C subtitles_en_alternate,3,10,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.409217357635498,848,LC_ALL=C subtitles_en_alternate,3,10,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.407381057739258,848,LC_ALL=C subtitles_en_alternate,3,10,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.413433790206909,848,LC_ALL=C subtitles_en_alternate,3,10,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.417088270187378,848,LC_ALL=C subtitles_en_alternate,3,10,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2927560806274414,848, subtitles_en_alternate,3,10,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.29286980628967285,848, subtitles_en_alternate,3,10,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.29212307929992676,848, subtitles_en_alternate,3,10,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2928035259246826,848, subtitles_en_alternate,3,10,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.29462766647338867,848, subtitles_en_alternate,3,10,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.29508256912231445,848, subtitles_en_alternate,3,10,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2949047088623047,848, subtitles_en_alternate,3,10,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.29440784454345703,848, subtitles_en_alternate,3,10,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.29571032524108887,848, subtitles_en_alternate,3,10,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2957477569580078,848, subtitles_en_alternate,3,10,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.9552104473114014,848,LC_ALL=C subtitles_en_alternate,3,10,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.9549355506896973,848,LC_ALL=C subtitles_en_alternate,3,10,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.9537510871887207,848,LC_ALL=C subtitles_en_alternate,3,10,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.9541327953338623,848,LC_ALL=C subtitles_en_alternate,3,10,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.956911087036133,848,LC_ALL=C subtitles_en_alternate,3,10,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.9570367336273193,848,LC_ALL=C subtitles_en_alternate,3,10,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.9511656761169434,848,LC_ALL=C subtitles_en_alternate,3,10,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.9506640434265137,848,LC_ALL=C subtitles_en_alternate,3,10,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.9526963233947754,848,LC_ALL=C subtitles_en_alternate,3,10,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.9588701725006104,848,LC_ALL=C subtitles_en_alternate_casei,3,10,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.168982028961182,862, subtitles_en_alternate_casei,3,10,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.168334722518921,862, subtitles_en_alternate_casei,3,10,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.168300628662109,862, subtitles_en_alternate_casei,3,10,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.167222499847412,862, subtitles_en_alternate_casei,3,10,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.166507244110107,862, subtitles_en_alternate_casei,3,10,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.170989274978638,862, subtitles_en_alternate_casei,3,10,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.1682024002075195,862, subtitles_en_alternate_casei,3,10,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.167780637741089,862, subtitles_en_alternate_casei,3,10,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.168872356414795,862, subtitles_en_alternate_casei,3,10,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.180398464202881,862, subtitles_en_alternate_casei,3,10,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4541521072387695,862, subtitles_en_alternate_casei,3,10,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4504010677337646,862, subtitles_en_alternate_casei,3,10,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.447232961654663,862, subtitles_en_alternate_casei,3,10,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4495904445648193,862, subtitles_en_alternate_casei,3,10,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4561190605163574,862, subtitles_en_alternate_casei,3,10,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4501171112060547,862, subtitles_en_alternate_casei,3,10,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.446692705154419,862, subtitles_en_alternate_casei,3,10,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4604244232177734,862, subtitles_en_alternate_casei,3,10,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4578661918640137,862, subtitles_en_alternate_casei,3,10,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4538376331329346,862, subtitles_en_alternate_casei,3,10,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.52874755859375,862,LC_ALL=C subtitles_en_alternate_casei,3,10,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.528880596160889,862,LC_ALL=C subtitles_en_alternate_casei,3,10,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.531128168106079,862,LC_ALL=C subtitles_en_alternate_casei,3,10,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.530141353607178,862,LC_ALL=C subtitles_en_alternate_casei,3,10,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.60682225227356,862,LC_ALL=C subtitles_en_alternate_casei,3,10,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.5284905433654785,862,LC_ALL=C subtitles_en_alternate_casei,3,10,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.528053283691406,862,LC_ALL=C subtitles_en_alternate_casei,3,10,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.52666974067688,862,LC_ALL=C subtitles_en_alternate_casei,3,10,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.530948877334595,862,LC_ALL=C subtitles_en_alternate_casei,3,10,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.527572393417358,862,LC_ALL=C subtitles_en_alternate_casei,3,10,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7230067253112793,862, subtitles_en_alternate_casei,3,10,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.72373366355896,862, subtitles_en_alternate_casei,3,10,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7248330116271973,862, subtitles_en_alternate_casei,3,10,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.723958730697632,862, subtitles_en_alternate_casei,3,10,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7269558906555176,862, subtitles_en_alternate_casei,3,10,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7254459857940674,862, subtitles_en_alternate_casei,3,10,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.722374439239502,862, subtitles_en_alternate_casei,3,10,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7215871810913086,862, subtitles_en_alternate_casei,3,10,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.722040891647339,862, subtitles_en_alternate_casei,3,10,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7217414379119873,862, subtitles_en_alternate_casei,3,10,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.120846271514893,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,3,10,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.124289512634277,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,3,10,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.121231555938721,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,3,10,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.133900880813599,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,3,10,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.13477349281311,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,3,10,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.124036550521851,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,3,10,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.12525200843811,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,3,10,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.119184970855713,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,3,10,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.11840033531189,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,3,10,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,5.127475023269653,862,LC_ALL=en_US.UTF-8 subtitles_en_literal,3,10,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.26776623725891113,629, subtitles_en_literal,3,10,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2677316665649414,629, subtitles_en_literal,3,10,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.26764774322509766,629, subtitles_en_literal,3,10,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.26764392852783203,629, subtitles_en_literal,3,10,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2678048610687256,629, subtitles_en_literal,3,10,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.26839542388916016,629, subtitles_en_literal,3,10,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2679786682128906,629, subtitles_en_literal,3,10,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.26825690269470215,629, subtitles_en_literal,3,10,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2678089141845703,629, subtitles_en_literal,3,10,rg,rg Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.2678341865539551,629, subtitles_en_literal,3,10,rg (no mmap),rg --no-mmap Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3364849090576172,629, subtitles_en_literal,3,10,rg (no mmap),rg --no-mmap Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.33446741104125977,629, subtitles_en_literal,3,10,rg (no mmap),rg --no-mmap Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3352184295654297,629, subtitles_en_literal,3,10,rg (no mmap),rg --no-mmap Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.33528780937194824,629, subtitles_en_literal,3,10,rg (no mmap),rg --no-mmap Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.33663368225097656,629, subtitles_en_literal,3,10,rg (no mmap),rg --no-mmap Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.33841681480407715,629, subtitles_en_literal,3,10,rg (no mmap),rg --no-mmap Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3371107578277588,629, subtitles_en_literal,3,10,rg (no mmap),rg --no-mmap Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3376932144165039,629, subtitles_en_literal,3,10,rg (no mmap),rg --no-mmap Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.33527708053588867,629, subtitles_en_literal,3,10,rg (no mmap),rg --no-mmap Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.33412981033325195,629, subtitles_en_literal,3,10,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4306020736694336,629, subtitles_en_literal,3,10,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4329919815063477,629, subtitles_en_literal,3,10,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4332242012023926,629, subtitles_en_literal,3,10,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.432997941970825,629, subtitles_en_literal,3,10,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4360785484313965,629, subtitles_en_literal,3,10,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.435281276702881,629, subtitles_en_literal,3,10,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.431150436401367,629, subtitles_en_literal,3,10,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4315969944000244,629, subtitles_en_literal,3,10,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4306139945983887,629, subtitles_en_literal,3,10,pt,pt -N Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4309916496276855,629, subtitles_en_literal,3,10,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.32330894470214844,629, subtitles_en_literal,3,10,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3243591785430908,629, subtitles_en_literal,3,10,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3266782760620117,629, subtitles_en_literal,3,10,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.32552504539489746,629, subtitles_en_literal,3,10,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.32386016845703125,629, subtitles_en_literal,3,10,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3260154724121094,629, subtitles_en_literal,3,10,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.32358860969543457,629, subtitles_en_literal,3,10,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3273475170135498,629, subtitles_en_literal,3,10,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3286449909210205,629, subtitles_en_literal,3,10,sift,sift Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3271455764770508,629, subtitles_en_literal,3,10,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5178654193878174,629,LC_ALL=C subtitles_en_literal,3,10,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5178477764129639,629,LC_ALL=C subtitles_en_literal,3,10,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5173301696777344,629,LC_ALL=C subtitles_en_literal,3,10,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5160887241363525,629,LC_ALL=C subtitles_en_literal,3,10,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5176410675048828,629,LC_ALL=C subtitles_en_literal,3,10,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5159375667572021,629,LC_ALL=C subtitles_en_literal,3,10,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5159437656402588,629,LC_ALL=C subtitles_en_literal,3,10,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5144126415252686,629,LC_ALL=C subtitles_en_literal,3,10,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5155332088470459,629,LC_ALL=C subtitles_en_literal,3,10,grep,grep -a Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.514521598815918,629,LC_ALL=C subtitles_en_literal,3,10,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5953242778778076,629, subtitles_en_literal,3,10,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5949890613555908,629, subtitles_en_literal,3,10,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5955290794372559,629, subtitles_en_literal,3,10,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5951504707336426,629, subtitles_en_literal,3,10,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5948066711425781,629, subtitles_en_literal,3,10,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5955345630645752,629, subtitles_en_literal,3,10,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5947279930114746,629, subtitles_en_literal,3,10,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5945889949798584,629, subtitles_en_literal,3,10,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5973446369171143,629, subtitles_en_literal,3,10,rg (lines),rg -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.594796895980835,629, subtitles_en_literal,3,10,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.734492301940918,629, subtitles_en_literal,3,10,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7287397384643555,629, subtitles_en_literal,3,10,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7362167835235596,629, subtitles_en_literal,3,10,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7313451766967773,629, subtitles_en_literal,3,10,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7278831005096436,629, subtitles_en_literal,3,10,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.728785276412964,629, subtitles_en_literal,3,10,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7299938201904297,629, subtitles_en_literal,3,10,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.727299213409424,629, subtitles_en_literal,3,10,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7277636528015137,629, subtitles_en_literal,3,10,ag (lines),ag -s Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7295165061950684,629, subtitles_en_literal,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7461349964141846,629, subtitles_en_literal,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7452898025512695,629, subtitles_en_literal,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7452714443206787,629, subtitles_en_literal,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.744922399520874,629, subtitles_en_literal,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7460696697235107,629, subtitles_en_literal,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7454876899719238,629, subtitles_en_literal,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7456295490264893,629, subtitles_en_literal,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7443864345550537,629, subtitles_en_literal,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7447819709777832,629, subtitles_en_literal,3,10,ucg (lines),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7446470260620117,629, subtitles_en_literal,3,10,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4404242038726807,629, subtitles_en_literal,3,10,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4294676780700684,629, subtitles_en_literal,3,10,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.429917097091675,629, subtitles_en_literal,3,10,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.431140422821045,629, subtitles_en_literal,3,10,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4285945892333984,629, subtitles_en_literal,3,10,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4293277263641357,629, subtitles_en_literal,3,10,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4368669986724854,629, subtitles_en_literal,3,10,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4359662532806396,629, subtitles_en_literal,3,10,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.4405126571655273,629, subtitles_en_literal,3,10,pt (lines),pt Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,3.433344841003418,629, subtitles_en_literal,3,10,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7574958801269531,629, subtitles_en_literal,3,10,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7570157051086426,629, subtitles_en_literal,3,10,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7525804042816162,629, subtitles_en_literal,3,10,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7591047286987305,629, subtitles_en_literal,3,10,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.755040168762207,629, subtitles_en_literal,3,10,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7555766105651855,629, subtitles_en_literal,3,10,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7529222965240479,629, subtitles_en_literal,3,10,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.758681058883667,629, subtitles_en_literal,3,10,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7559700012207031,629, subtitles_en_literal,3,10,sift (lines),sift -n Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.7559340000152588,629, subtitles_en_literal,3,10,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9682326316833496,629,LC_ALL=C subtitles_en_literal,3,10,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9697835445404053,629,LC_ALL=C subtitles_en_literal,3,10,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9684174060821533,629,LC_ALL=C subtitles_en_literal,3,10,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9705235958099365,629,LC_ALL=C subtitles_en_literal,3,10,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9682950973510742,629,LC_ALL=C subtitles_en_literal,3,10,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9695034027099609,629,LC_ALL=C subtitles_en_literal,3,10,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9688384532928467,629,LC_ALL=C subtitles_en_literal,3,10,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9686503410339355,629,LC_ALL=C subtitles_en_literal,3,10,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9681143760681152,629,LC_ALL=C subtitles_en_literal,3,10,grep (lines),grep -an Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9680168628692627,629,LC_ALL=C subtitles_en_literal_casei,3,10,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3666412830352783,642, subtitles_en_literal_casei,3,10,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3665914535522461,642, subtitles_en_literal_casei,3,10,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.36571455001831055,642, subtitles_en_literal_casei,3,10,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3664999008178711,642, subtitles_en_literal_casei,3,10,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.36658453941345215,642, subtitles_en_literal_casei,3,10,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3661923408508301,642, subtitles_en_literal_casei,3,10,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.36447882652282715,642, subtitles_en_literal_casei,3,10,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3663473129272461,642, subtitles_en_literal_casei,3,10,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.36589932441711426,642, subtitles_en_literal_casei,3,10,rg,rg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.3653714656829834,642, subtitles_en_literal_casei,3,10,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.081154823303223,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,3,10,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.084660291671753,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,3,10,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.08470344543457,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,3,10,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.082594156265259,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,3,10,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.080471515655518,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,3,10,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.086612701416016,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,3,10,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.081760406494141,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,3,10,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.097002983093262,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,3,10,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.08205771446228,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,3,10,grep,grep -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.081174373626709,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,3,10,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6137702465057373,642,LC_ALL=C subtitles_en_literal_casei,3,10,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.613584041595459,642,LC_ALL=C subtitles_en_literal_casei,3,10,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6138026714324951,642,LC_ALL=C subtitles_en_literal_casei,3,10,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6139190196990967,642,LC_ALL=C subtitles_en_literal_casei,3,10,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.613776445388794,642,LC_ALL=C subtitles_en_literal_casei,3,10,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6142146587371826,642,LC_ALL=C subtitles_en_literal_casei,3,10,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6156847476959229,642,LC_ALL=C subtitles_en_literal_casei,3,10,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6130235195159912,642,LC_ALL=C subtitles_en_literal_casei,3,10,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6155576705932617,642,LC_ALL=C subtitles_en_literal_casei,3,10,grep (ASCII),grep -E -ai Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6164846420288086,642,LC_ALL=C subtitles_en_literal_casei,3,10,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6970095634460449,642, subtitles_en_literal_casei,3,10,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6997818946838379,642, subtitles_en_literal_casei,3,10,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6979782581329346,642, subtitles_en_literal_casei,3,10,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6970696449279785,642, subtitles_en_literal_casei,3,10,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6959774494171143,642, subtitles_en_literal_casei,3,10,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6961612701416016,642, subtitles_en_literal_casei,3,10,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6932253837585449,642, subtitles_en_literal_casei,3,10,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6929948329925537,642, subtitles_en_literal_casei,3,10,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6953890323638916,642, subtitles_en_literal_casei,3,10,rg (lines),rg -n -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6952941417694092,642, subtitles_en_literal_casei,3,10,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7740752696990967,642, subtitles_en_literal_casei,3,10,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.774446964263916,642, subtitles_en_literal_casei,3,10,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7716448307037354,642, subtitles_en_literal_casei,3,10,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.773153781890869,642, subtitles_en_literal_casei,3,10,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.779618740081787,642, subtitles_en_literal_casei,3,10,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7801287174224854,642, subtitles_en_literal_casei,3,10,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.781130075454712,642, subtitles_en_literal_casei,3,10,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.772829055786133,642, subtitles_en_literal_casei,3,10,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.77199649810791,642, subtitles_en_literal_casei,3,10,ag (lines) (ASCII),ag -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7716152667999268,642, subtitles_en_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.839766263961792,642, subtitles_en_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8391139507293701,642, subtitles_en_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8380751609802246,642, subtitles_en_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.840296745300293,642, subtitles_en_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8403871059417725,642, subtitles_en_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8408434391021729,642, subtitles_en_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8414220809936523,642, subtitles_en_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8398075103759766,642, subtitles_en_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8436241149902344,642, subtitles_en_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8423728942871094,642, subtitles_en_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5950007438659668,629, subtitles_en_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5956854820251465,629, subtitles_en_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5952165126800537,629, subtitles_en_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5980286598205566,629, subtitles_en_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5956542491912842,629, subtitles_en_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5966405868530273,629, subtitles_en_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5958805084228516,629, subtitles_en_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5963141918182373,629, subtitles_en_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5990002155303955,629, subtitles_en_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5966975688934326,629, subtitles_en_literal_word,3,10,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7282555103302,629, subtitles_en_literal_word,3,10,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.729177474975586,629, subtitles_en_literal_word,3,10,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7297959327697754,629, subtitles_en_literal_word,3,10,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7296860218048096,629, subtitles_en_literal_word,3,10,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.729125499725342,629, subtitles_en_literal_word,3,10,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.729316234588623,629, subtitles_en_literal_word,3,10,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7287533283233643,629, subtitles_en_literal_word,3,10,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7305104732513428,629, subtitles_en_literal_word,3,10,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7299206256866455,629, subtitles_en_literal_word,3,10,ag (ASCII),ag -sw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.729327440261841,629, subtitles_en_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8094220161437988,629, subtitles_en_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8118293285369873,629, subtitles_en_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8110437393188477,629, subtitles_en_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.811244010925293,629, subtitles_en_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8089673519134521,629, subtitles_en_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8087558746337891,629, subtitles_en_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8099534511566162,629, subtitles_en_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.805889368057251,629, subtitles_en_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.8085830211639404,629, subtitles_en_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.810387134552002,629, subtitles_en_literal_word,3,10,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.969839334487915,629,LC_ALL=C subtitles_en_literal_word,3,10,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9697055816650391,629,LC_ALL=C subtitles_en_literal_word,3,10,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.969874382019043,629,LC_ALL=C subtitles_en_literal_word,3,10,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9701571464538574,629,LC_ALL=C subtitles_en_literal_word,3,10,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9694199562072754,629,LC_ALL=C subtitles_en_literal_word,3,10,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9696424007415771,629,LC_ALL=C subtitles_en_literal_word,3,10,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9697527885437012,629,LC_ALL=C subtitles_en_literal_word,3,10,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.968994140625,629,LC_ALL=C subtitles_en_literal_word,3,10,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9701812267303467,629,LC_ALL=C subtitles_en_literal_word,3,10,grep (ASCII),grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9686706066131592,629,LC_ALL=C subtitles_en_literal_word,3,10,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.595914363861084,629, subtitles_en_literal_word,3,10,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5983798503875732,629, subtitles_en_literal_word,3,10,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5960469245910645,629, subtitles_en_literal_word,3,10,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5948517322540283,629, subtitles_en_literal_word,3,10,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5958602428436279,629, subtitles_en_literal_word,3,10,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5954585075378418,629, subtitles_en_literal_word,3,10,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5953717231750488,629, subtitles_en_literal_word,3,10,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5959024429321289,629, subtitles_en_literal_word,3,10,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5959782600402832,629, subtitles_en_literal_word,3,10,rg,rg -nw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.5955371856689453,629, subtitles_en_literal_word,3,10,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9723165035247803,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,3,10,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9710309505462646,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,3,10,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9703977108001709,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,3,10,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9703128337860107,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,3,10,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9703538417816162,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,3,10,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9708397388458252,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,3,10,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9728231430053711,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,3,10,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9786312580108643,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,3,10,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9749376773834229,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,3,10,grep,grep -anw Sherlock Holmes /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.9707028865814209,629,LC_ALL=en_US.UTF-8 subtitles_en_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7828025817871094,13, subtitles_en_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7794389724731445,13, subtitles_en_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.778043270111084,13, subtitles_en_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.774141788482666,13, subtitles_en_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.778355121612549,13, subtitles_en_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7741646766662598,13, subtitles_en_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.772979259490967,13, subtitles_en_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7767364978790283,13, subtitles_en_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7799744606018066,13, subtitles_en_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.7726826667785645,13, subtitles_en_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.551705837249756,13, subtitles_en_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.5482068061828613,13, subtitles_en_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.538416624069214,13, subtitles_en_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.5385212898254395,13, subtitles_en_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.5387394428253174,13, subtitles_en_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.5385680198669434,13, subtitles_en_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.5381128787994385,13, subtitles_en_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.538067579269409,13, subtitles_en_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.5391359329223633,13, subtitles_en_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,2.5382723808288574,13, subtitles_en_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.07424545288086,48, subtitles_en_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.07216191291809,48, subtitles_en_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.090161323547363,48, subtitles_en_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.073503732681274,48, subtitles_en_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.074660062789917,48, subtitles_en_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.071975708007812,48, subtitles_en_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.076007604598999,48, subtitles_en_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.074021816253662,48, subtitles_en_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.075836896896362,48, subtitles_en_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,10.07709789276123,48, subtitles_en_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.783349275588989,13, subtitles_en_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.7711498737335205,13, subtitles_en_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.7679526805877686,13, subtitles_en_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.769197463989258,13, subtitles_en_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.770420789718628,13, subtitles_en_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.770123720169067,13, subtitles_en_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.769317150115967,13, subtitles_en_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.772680997848511,13, subtitles_en_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.769444227218628,13, subtitles_en_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,7.768393516540527,13, subtitles_en_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.407429218292236,13,LC_ALL=C subtitles_en_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.40935754776001,13,LC_ALL=C subtitles_en_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.409480810165405,13,LC_ALL=C subtitles_en_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.409695625305176,13,LC_ALL=C subtitles_en_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.4078004360198975,13,LC_ALL=C subtitles_en_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.413295745849609,13,LC_ALL=C subtitles_en_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.420169353485107,13,LC_ALL=C subtitles_en_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.414563179016113,13,LC_ALL=C subtitles_en_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.40968656539917,13,LC_ALL=C subtitles_en_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.410497188568115,13,LC_ALL=C subtitles_en_surrounding_words,3,10,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.605414628982544,317, subtitles_en_surrounding_words,3,10,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6049544811248779,317, subtitles_en_surrounding_words,3,10,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6051681041717529,317, subtitles_en_surrounding_words,3,10,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6063950061798096,317, subtitles_en_surrounding_words,3,10,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6052758693695068,317, subtitles_en_surrounding_words,3,10,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6048481464385986,317, subtitles_en_surrounding_words,3,10,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.60489821434021,317, subtitles_en_surrounding_words,3,10,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6051614284515381,317, subtitles_en_surrounding_words,3,10,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6050229072570801,317, subtitles_en_surrounding_words,3,10,rg,rg -n \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6052291393280029,317, subtitles_en_surrounding_words,3,10,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2898845672607422,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,3,10,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2869348526000977,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,3,10,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2862842082977295,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,3,10,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2864055633544922,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,3,10,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2851040363311768,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,3,10,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.285186529159546,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,3,10,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2865922451019287,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,3,10,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2853999137878418,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,3,10,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2826249599456787,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,3,10,grep,grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2860167026519775,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,3,10,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6012325286865234,317, subtitles_en_surrounding_words,3,10,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.601163387298584,317, subtitles_en_surrounding_words,3,10,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6019690036773682,317, subtitles_en_surrounding_words,3,10,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6013593673706055,317, subtitles_en_surrounding_words,3,10,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6016466617584229,317, subtitles_en_surrounding_words,3,10,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6019842624664307,317, subtitles_en_surrounding_words,3,10,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6014797687530518,317, subtitles_en_surrounding_words,3,10,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6019721031188965,317, subtitles_en_surrounding_words,3,10,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.601752758026123,317, subtitles_en_surrounding_words,3,10,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,0.6017599105834961,317, subtitles_en_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.68667197227478,323, subtitles_en_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.660332679748535,323, subtitles_en_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.660835266113281,323, subtitles_en_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.660434007644653,323, subtitles_en_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.664055347442627,323, subtitles_en_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.662182569503784,323, subtitles_en_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.660929679870605,323, subtitles_en_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.657424688339233,323, subtitles_en_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.659005165100098,323, subtitles_en_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,11.660208225250244,323, subtitles_en_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.690763711929321,317, subtitles_en_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.688983201980591,317, subtitles_en_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.69182276725769,317, subtitles_en_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.690439462661743,317, subtitles_en_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.689068794250488,317, subtitles_en_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.6937761306762695,317, subtitles_en_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.6903581619262695,317, subtitles_en_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.687433242797852,317, subtitles_en_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.68887186050415,317, subtitles_en_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,4.686846017837524,317, subtitles_en_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2726647853851318,317,LC_ALL=C subtitles_en_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2737226486206055,317,LC_ALL=C subtitles_en_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2792630195617676,317,LC_ALL=C subtitles_en_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2764034271240234,317,LC_ALL=C subtitles_en_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2774908542633057,317,LC_ALL=C subtitles_en_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2776587009429932,317,LC_ALL=C subtitles_en_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2776594161987305,317,LC_ALL=C subtitles_en_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2777113914489746,317,LC_ALL=C subtitles_en_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2754859924316406,317,LC_ALL=C subtitles_en_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.sample.en,1.2763752937316895,317,LC_ALL=C subtitles_ru_alternate,3,10,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.9028000831604004,691, subtitles_ru_alternate,3,10,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.901930332183838,691, subtitles_ru_alternate,3,10,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.9000146389007568,691, subtitles_ru_alternate,3,10,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.9049570560455322,691, subtitles_ru_alternate,3,10,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.9017412662506104,691, subtitles_ru_alternate,3,10,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.9024994373321533,691, subtitles_ru_alternate,3,10,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.9020378589630127,691, subtitles_ru_alternate,3,10,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.901792049407959,691, subtitles_ru_alternate,3,10,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.9039933681488037,691, subtitles_ru_alternate,3,10,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8997247219085693,691, subtitles_ru_alternate,3,10,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.9008402824401855,691, subtitles_ru_alternate,3,10,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.893612861633301,691, subtitles_ru_alternate,3,10,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.8897013664245605,691, subtitles_ru_alternate,3,10,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.890028238296509,691, subtitles_ru_alternate,3,10,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.889577865600586,691, subtitles_ru_alternate,3,10,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.890358209609985,691, subtitles_ru_alternate,3,10,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.890805244445801,691, subtitles_ru_alternate,3,10,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.891323804855347,691, subtitles_ru_alternate,3,10,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.890573501586914,691, subtitles_ru_alternate,3,10,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.892488718032837,691, subtitles_ru_alternate,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.8788585662841797,691, subtitles_ru_alternate,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.863766670227051,691, subtitles_ru_alternate,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.8625569343566895,691, subtitles_ru_alternate,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.857377529144287,691, subtitles_ru_alternate,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.8643264770507812,691, subtitles_ru_alternate,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.863802909851074,691, subtitles_ru_alternate,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.859354019165039,691, subtitles_ru_alternate,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.8629326820373535,691, subtitles_ru_alternate,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.862051486968994,691, subtitles_ru_alternate,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.8658623695373535,691, subtitles_ru_alternate,3,10,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.515479803085327,691,LC_ALL=C subtitles_ru_alternate,3,10,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.503782033920288,691,LC_ALL=C subtitles_ru_alternate,3,10,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.510310888290405,691,LC_ALL=C subtitles_ru_alternate,3,10,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.509161472320557,691,LC_ALL=C subtitles_ru_alternate,3,10,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.52185344696045,691,LC_ALL=C subtitles_ru_alternate,3,10,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.509994506835938,691,LC_ALL=C subtitles_ru_alternate,3,10,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.509246349334717,691,LC_ALL=C subtitles_ru_alternate,3,10,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.511957168579102,691,LC_ALL=C subtitles_ru_alternate,3,10,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.508247375488281,691,LC_ALL=C subtitles_ru_alternate,3,10,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.51308274269104,691,LC_ALL=C subtitles_ru_alternate,3,10,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3016955852508545,691, subtitles_ru_alternate,3,10,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.299199104309082,691, subtitles_ru_alternate,3,10,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3037669658660889,691, subtitles_ru_alternate,3,10,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.303251028060913,691, subtitles_ru_alternate,3,10,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.2978003025054932,691, subtitles_ru_alternate,3,10,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3006718158721924,691, subtitles_ru_alternate,3,10,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3024837970733643,691, subtitles_ru_alternate,3,10,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.297926425933838,691, subtitles_ru_alternate,3,10,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.297990083694458,691, subtitles_ru_alternate,3,10,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.298790693283081,691, subtitles_ru_alternate,3,10,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,7.991622447967529,691,LC_ALL=C subtitles_ru_alternate,3,10,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,7.981353759765625,691,LC_ALL=C subtitles_ru_alternate,3,10,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,7.982196092605591,691,LC_ALL=C subtitles_ru_alternate,3,10,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,7.99190878868103,691,LC_ALL=C subtitles_ru_alternate,3,10,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.016578912734985,691,LC_ALL=C subtitles_ru_alternate,3,10,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,7.9818947315216064,691,LC_ALL=C subtitles_ru_alternate,3,10,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,7.982048988342285,691,LC_ALL=C subtitles_ru_alternate,3,10,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,7.986757755279541,691,LC_ALL=C subtitles_ru_alternate,3,10,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,7.99491548538208,691,LC_ALL=C subtitles_ru_alternate,3,10,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.03109359741211,691,LC_ALL=C subtitles_ru_alternate_casei,3,10,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.890226364135742,691, subtitles_ru_alternate_casei,3,10,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.891613721847534,691, subtitles_ru_alternate_casei,3,10,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.890208959579468,691, subtitles_ru_alternate_casei,3,10,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.892171859741211,691, subtitles_ru_alternate_casei,3,10,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.891136407852173,691, subtitles_ru_alternate_casei,3,10,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.8886566162109375,691, subtitles_ru_alternate_casei,3,10,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.889105319976807,691, subtitles_ru_alternate_casei,3,10,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.890317916870117,691, subtitles_ru_alternate_casei,3,10,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.890429496765137,691, subtitles_ru_alternate_casei,3,10,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,5.891230344772339,691, subtitles_ru_alternate_casei,3,10,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.868140935897827,691, subtitles_ru_alternate_casei,3,10,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.863978624343872,691, subtitles_ru_alternate_casei,3,10,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.862642526626587,691, subtitles_ru_alternate_casei,3,10,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.8691396713256836,691, subtitles_ru_alternate_casei,3,10,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.871619939804077,691, subtitles_ru_alternate_casei,3,10,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.877925395965576,691, subtitles_ru_alternate_casei,3,10,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.8617172241210938,691, subtitles_ru_alternate_casei,3,10,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.8666179180145264,691, subtitles_ru_alternate_casei,3,10,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.866544246673584,691, subtitles_ru_alternate_casei,3,10,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.868028163909912,691, subtitles_ru_alternate_casei,3,10,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.564217805862427,691,LC_ALL=C subtitles_ru_alternate_casei,3,10,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.56824803352356,691,LC_ALL=C subtitles_ru_alternate_casei,3,10,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.567821741104126,691,LC_ALL=C subtitles_ru_alternate_casei,3,10,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.568634986877441,691,LC_ALL=C subtitles_ru_alternate_casei,3,10,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.564311742782593,691,LC_ALL=C subtitles_ru_alternate_casei,3,10,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.573625564575195,691,LC_ALL=C subtitles_ru_alternate_casei,3,10,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.590597152709961,691,LC_ALL=C subtitles_ru_alternate_casei,3,10,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.56586766242981,691,LC_ALL=C subtitles_ru_alternate_casei,3,10,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.572263956069946,691,LC_ALL=C subtitles_ru_alternate_casei,3,10,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.582438707351685,691,LC_ALL=C subtitles_ru_alternate_casei,3,10,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.836108446121216,735, subtitles_ru_alternate_casei,3,10,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.830481290817261,735, subtitles_ru_alternate_casei,3,10,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.837197780609131,735, subtitles_ru_alternate_casei,3,10,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.831356048583984,735, subtitles_ru_alternate_casei,3,10,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.829216480255127,735, subtitles_ru_alternate_casei,3,10,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.835860013961792,735, subtitles_ru_alternate_casei,3,10,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.8315253257751465,735, subtitles_ru_alternate_casei,3,10,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.832231044769287,735, subtitles_ru_alternate_casei,3,10,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.843297004699707,735, subtitles_ru_alternate_casei,3,10,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.830520153045654,735, subtitles_ru_alternate_casei,3,10,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.727419137954712,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,3,10,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.736006021499634,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,3,10,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.733150720596313,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,3,10,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.727008819580078,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,3,10,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.726323366165161,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,3,10,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.724290132522583,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,3,10,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.725264549255371,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,3,10,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.726403951644897,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,3,10,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.729755640029907,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,3,10,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.736154317855835,735,LC_ALL=en_US.UTF-8 subtitles_ru_literal,3,10,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3251616954803467,583, subtitles_ru_literal,3,10,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3260176181793213,583, subtitles_ru_literal,3,10,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.325009822845459,583, subtitles_ru_literal,3,10,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3253958225250244,583, subtitles_ru_literal,3,10,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3255586624145508,583, subtitles_ru_literal,3,10,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.32509374618530273,583, subtitles_ru_literal,3,10,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.32692670822143555,583, subtitles_ru_literal,3,10,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.32549190521240234,583, subtitles_ru_literal,3,10,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.32480716705322266,583, subtitles_ru_literal,3,10,rg,rg Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3243875503540039,583, subtitles_ru_literal,3,10,rg (no mmap),rg --no-mmap Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.4499814510345459,583, subtitles_ru_literal,3,10,rg (no mmap),rg --no-mmap Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.45062875747680664,583, subtitles_ru_literal,3,10,rg (no mmap),rg --no-mmap Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.4532792568206787,583, subtitles_ru_literal,3,10,rg (no mmap),rg --no-mmap Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.4568295478820801,583, subtitles_ru_literal,3,10,rg (no mmap),rg --no-mmap Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.45064687728881836,583, subtitles_ru_literal,3,10,rg (no mmap),rg --no-mmap Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.4510054588317871,583, subtitles_ru_literal,3,10,rg (no mmap),rg --no-mmap Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.45026254653930664,583, subtitles_ru_literal,3,10,rg (no mmap),rg --no-mmap Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.4513223171234131,583, subtitles_ru_literal,3,10,rg (no mmap),rg --no-mmap Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.4508659839630127,583, subtitles_ru_literal,3,10,rg (no mmap),rg --no-mmap Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.45338964462280273,583, subtitles_ru_literal,3,10,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.911964416503906,583, subtitles_ru_literal,3,10,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.907763004302979,583, subtitles_ru_literal,3,10,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.93012261390686,583, subtitles_ru_literal,3,10,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.91182827949524,583, subtitles_ru_literal,3,10,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.911576986312866,583, subtitles_ru_literal,3,10,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.928250551223755,583, subtitles_ru_literal,3,10,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.926709175109863,583, subtitles_ru_literal,3,10,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.9106764793396,583, subtitles_ru_literal,3,10,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.90697717666626,583, subtitles_ru_literal,3,10,pt,pt -N Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.926398754119873,583, subtitles_ru_literal,3,10,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.41078209877014,583, subtitles_ru_literal,3,10,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.421114921569824,583, subtitles_ru_literal,3,10,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.42653226852417,583, subtitles_ru_literal,3,10,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.411635160446167,583, subtitles_ru_literal,3,10,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.41897940635681,583, subtitles_ru_literal,3,10,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.415560722351074,583, subtitles_ru_literal,3,10,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.41150665283203,583, subtitles_ru_literal,3,10,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.434045553207397,583, subtitles_ru_literal,3,10,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.408607959747314,583, subtitles_ru_literal,3,10,sift,sift Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,16.418298482894897,583, subtitles_ru_literal,3,10,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7815132141113281,583,LC_ALL=C subtitles_ru_literal,3,10,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7787928581237793,583,LC_ALL=C subtitles_ru_literal,3,10,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7789037227630615,583,LC_ALL=C subtitles_ru_literal,3,10,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7791144847869873,583,LC_ALL=C subtitles_ru_literal,3,10,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7804174423217773,583,LC_ALL=C subtitles_ru_literal,3,10,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7803263664245605,583,LC_ALL=C subtitles_ru_literal,3,10,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.779409646987915,583,LC_ALL=C subtitles_ru_literal,3,10,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7803800106048584,583,LC_ALL=C subtitles_ru_literal,3,10,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7826926708221436,583,LC_ALL=C subtitles_ru_literal,3,10,grep,grep -a Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7790436744689941,583,LC_ALL=C subtitles_ru_literal,3,10,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9256212711334229,583, subtitles_ru_literal,3,10,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9252862930297852,583, subtitles_ru_literal,3,10,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9253382682800293,583, subtitles_ru_literal,3,10,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9255073070526123,583, subtitles_ru_literal,3,10,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.925473690032959,583, subtitles_ru_literal,3,10,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9254281520843506,583, subtitles_ru_literal,3,10,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9273276329040527,583, subtitles_ru_literal,3,10,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9264523983001709,583, subtitles_ru_literal,3,10,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9256389141082764,583, subtitles_ru_literal,3,10,rg (lines),rg -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9267659187316895,583, subtitles_ru_literal,3,10,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.481263160705566,583, subtitles_ru_literal,3,10,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.478214979171753,583, subtitles_ru_literal,3,10,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.479391813278198,583, subtitles_ru_literal,3,10,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.480245590209961,583, subtitles_ru_literal,3,10,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.479216575622559,583, subtitles_ru_literal,3,10,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.480084419250488,583, subtitles_ru_literal,3,10,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.4808125495910645,583, subtitles_ru_literal,3,10,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.479414224624634,583, subtitles_ru_literal,3,10,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.477892637252808,583, subtitles_ru_literal,3,10,ag (lines),ag -s Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.488618850708008,583, subtitles_ru_literal,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8875257968902588,583, subtitles_ru_literal,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8994288444519043,583, subtitles_ru_literal,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8891081809997559,583, subtitles_ru_literal,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8927254676818848,583, subtitles_ru_literal,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8885462284088135,583, subtitles_ru_literal,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8860197067260742,583, subtitles_ru_literal,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8897171020507812,583, subtitles_ru_literal,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8881864547729492,583, subtitles_ru_literal,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8842110633850098,583, subtitles_ru_literal,3,10,ucg (lines),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8878448009490967,583, subtitles_ru_literal,3,10,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.960192918777466,583, subtitles_ru_literal,3,10,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.926759719848633,583, subtitles_ru_literal,3,10,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.929388761520386,583, subtitles_ru_literal,3,10,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.947829723358154,583, subtitles_ru_literal,3,10,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.930480718612671,583, subtitles_ru_literal,3,10,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.931763648986816,583, subtitles_ru_literal,3,10,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.929036140441895,583, subtitles_ru_literal,3,10,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.93698763847351,583, subtitles_ru_literal,3,10,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.929525375366211,583, subtitles_ru_literal,3,10,pt (lines),pt Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,12.932105541229248,583, subtitles_ru_literal,3,10,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.172893047332764,583, subtitles_ru_literal,3,10,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.174585819244385,583, subtitles_ru_literal,3,10,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.17912483215332,583, subtitles_ru_literal,3,10,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.173067092895508,583, subtitles_ru_literal,3,10,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.189521074295044,583, subtitles_ru_literal,3,10,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.172780513763428,583, subtitles_ru_literal,3,10,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.16919755935669,583, subtitles_ru_literal,3,10,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.16868829727173,583, subtitles_ru_literal,3,10,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.19803738594055,583, subtitles_ru_literal,3,10,sift (lines),sift -n Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,17.171013832092285,583, subtitles_ru_literal,3,10,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.2980215549468994,583,LC_ALL=C subtitles_ru_literal,3,10,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.2992823123931885,583,LC_ALL=C subtitles_ru_literal,3,10,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.2971000671386719,583,LC_ALL=C subtitles_ru_literal,3,10,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.2973082065582275,583,LC_ALL=C subtitles_ru_literal,3,10,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.2979285717010498,583,LC_ALL=C subtitles_ru_literal,3,10,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.299248218536377,583,LC_ALL=C subtitles_ru_literal,3,10,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.307051658630371,583,LC_ALL=C subtitles_ru_literal,3,10,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3012950420379639,583,LC_ALL=C subtitles_ru_literal,3,10,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.300577163696289,583,LC_ALL=C subtitles_ru_literal,3,10,grep (lines),grep -an Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.2991137504577637,583,LC_ALL=C subtitles_ru_literal_casei,3,10,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.1314334869384766,604, subtitles_ru_literal_casei,3,10,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.1306557655334473,604, subtitles_ru_literal_casei,3,10,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.1315603256225586,604, subtitles_ru_literal_casei,3,10,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.1313893795013428,604, subtitles_ru_literal_casei,3,10,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.132558822631836,604, subtitles_ru_literal_casei,3,10,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.1295897960662842,604, subtitles_ru_literal_casei,3,10,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.131528615951538,604, subtitles_ru_literal_casei,3,10,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.130932092666626,604, subtitles_ru_literal_casei,3,10,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.1316814422607422,604, subtitles_ru_literal_casei,3,10,rg,rg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.1331970691680908,604, subtitles_ru_literal_casei,3,10,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.192144632339478,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,3,10,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.181128025054932,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,3,10,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.183438777923584,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,3,10,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.195424556732178,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,3,10,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.191128015518188,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,3,10,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.181877851486206,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,3,10,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.183242797851562,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,3,10,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.18350863456726,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,3,10,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.18522834777832,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,3,10,grep,grep -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,8.195779085159302,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,3,10,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7842297554016113,583,LC_ALL=C subtitles_ru_literal_casei,3,10,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7869102954864502,583,LC_ALL=C subtitles_ru_literal_casei,3,10,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7825243473052979,583,LC_ALL=C subtitles_ru_literal_casei,3,10,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7850461006164551,583,LC_ALL=C subtitles_ru_literal_casei,3,10,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7839555740356445,583,LC_ALL=C subtitles_ru_literal_casei,3,10,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7831940650939941,583,LC_ALL=C subtitles_ru_literal_casei,3,10,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7849681377410889,583,LC_ALL=C subtitles_ru_literal_casei,3,10,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7857487201690674,583,LC_ALL=C subtitles_ru_literal_casei,3,10,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7865192890167236,583,LC_ALL=C subtitles_ru_literal_casei,3,10,grep (ASCII),grep -E -ai Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.784534215927124,583,LC_ALL=C subtitles_ru_literal_casei,3,10,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.731257438659668,604, subtitles_ru_literal_casei,3,10,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.730975866317749,604, subtitles_ru_literal_casei,3,10,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.731431007385254,604, subtitles_ru_literal_casei,3,10,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.733675479888916,604, subtitles_ru_literal_casei,3,10,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7313485145568848,604, subtitles_ru_literal_casei,3,10,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7320530414581299,604, subtitles_ru_literal_casei,3,10,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7312524318695068,604, subtitles_ru_literal_casei,3,10,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7336010932922363,604, subtitles_ru_literal_casei,3,10,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7369468212127686,604, subtitles_ru_literal_casei,3,10,rg (lines),rg -n -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.7337863445281982,604, subtitles_ru_literal_casei,3,10,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7288784980773926,, subtitles_ru_literal_casei,3,10,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7287564277648926,, subtitles_ru_literal_casei,3,10,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7289779186248779,, subtitles_ru_literal_casei,3,10,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7297887802124023,, subtitles_ru_literal_casei,3,10,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7297365665435791,, subtitles_ru_literal_casei,3,10,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7302100658416748,, subtitles_ru_literal_casei,3,10,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7292482852935791,, subtitles_ru_literal_casei,3,10,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7287256717681885,, subtitles_ru_literal_casei,3,10,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7282981872558594,, subtitles_ru_literal_casei,3,10,ag (lines) (ASCII),ag -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7294399738311768,, subtitles_ru_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.902496337890625,583, subtitles_ru_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.9001023769378662,583, subtitles_ru_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.895233392715454,583, subtitles_ru_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8891777992248535,583, subtitles_ru_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8906826972961426,583, subtitles_ru_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.9022135734558105,583, subtitles_ru_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8985214233398438,583, subtitles_ru_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8962385654449463,583, subtitles_ru_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8911592960357666,583, subtitles_ru_literal_casei,3,10,ucg (lines) (ASCII),ucg -i Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.894214153289795,583, subtitles_ru_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3251180648803711,, subtitles_ru_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3250443935394287,, subtitles_ru_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3250398635864258,, subtitles_ru_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3258678913116455,, subtitles_ru_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3260321617126465,, subtitles_ru_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.32577013969421387,, subtitles_ru_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.32557225227355957,, subtitles_ru_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.32527589797973633,, subtitles_ru_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3257458209991455,, subtitles_ru_literal_word,3,10,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.3253803253173828,, subtitles_ru_literal_word,3,10,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7521560192108154,, subtitles_ru_literal_word,3,10,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7522988319396973,, subtitles_ru_literal_word,3,10,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7518208026885986,, subtitles_ru_literal_word,3,10,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7535896301269531,, subtitles_ru_literal_word,3,10,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7515583038330078,, subtitles_ru_literal_word,3,10,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.75272536277771,, subtitles_ru_literal_word,3,10,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7540724277496338,, subtitles_ru_literal_word,3,10,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7537317276000977,, subtitles_ru_literal_word,3,10,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7529683113098145,, subtitles_ru_literal_word,3,10,ag (ASCII),ag -sw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.7519652843475342,, subtitles_ru_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.895404577255249,583, subtitles_ru_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8901162147521973,583, subtitles_ru_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8873977661132812,583, subtitles_ru_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.885707139968872,583, subtitles_ru_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8928821086883545,583, subtitles_ru_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8904106616973877,583, subtitles_ru_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8904242515563965,583, subtitles_ru_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.890967845916748,583, subtitles_ru_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.8881947994232178,583, subtitles_ru_literal_word,3,10,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.900097131729126,583, subtitles_ru_literal_word,3,10,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.301781415939331,583,LC_ALL=C subtitles_ru_literal_word,3,10,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3029043674468994,583,LC_ALL=C subtitles_ru_literal_word,3,10,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.302168369293213,583,LC_ALL=C subtitles_ru_literal_word,3,10,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3010151386260986,583,LC_ALL=C subtitles_ru_literal_word,3,10,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3041775226593018,583,LC_ALL=C subtitles_ru_literal_word,3,10,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3008759021759033,583,LC_ALL=C subtitles_ru_literal_word,3,10,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3115224838256836,583,LC_ALL=C subtitles_ru_literal_word,3,10,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3092575073242188,583,LC_ALL=C subtitles_ru_literal_word,3,10,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3020920753479004,583,LC_ALL=C subtitles_ru_literal_word,3,10,grep (ASCII),grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.299107313156128,583,LC_ALL=C subtitles_ru_literal_word,3,10,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9281308650970459,579, subtitles_ru_literal_word,3,10,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9305391311645508,579, subtitles_ru_literal_word,3,10,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.928086519241333,579, subtitles_ru_literal_word,3,10,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9288325309753418,579, subtitles_ru_literal_word,3,10,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9280257225036621,579, subtitles_ru_literal_word,3,10,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9294643402099609,579, subtitles_ru_literal_word,3,10,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9276673793792725,579, subtitles_ru_literal_word,3,10,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9298434257507324,579, subtitles_ru_literal_word,3,10,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9300410747528076,579, subtitles_ru_literal_word,3,10,rg,rg -nw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.928978443145752,579, subtitles_ru_literal_word,3,10,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3036572933197021,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,3,10,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.301509141921997,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,3,10,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.301844596862793,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,3,10,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.300811767578125,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,3,10,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3004207611083984,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,3,10,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3020946979522705,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,3,10,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3045520782470703,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,3,10,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3078258037567139,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,3,10,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3057043552398682,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,3,10,grep,grep -anw Шерлок Холмс /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.3066091537475586,579,LC_ALL=en_US.UTF-8 subtitles_ru_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.906493186950684,41, subtitles_ru_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.905959129333496,41, subtitles_ru_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.9105610847473145,41, subtitles_ru_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.905940532684326,41, subtitles_ru_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.903593063354492,41, subtitles_ru_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.902836561203003,41, subtitles_ru_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.903217792510986,41, subtitles_ru_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.903507709503174,41, subtitles_ru_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.905400037765503,41, subtitles_ru_no_literal,3,10,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,4.898482322692871,41, subtitles_ru_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.972111940383911,, subtitles_ru_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.970813512802124,, subtitles_ru_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.976404905319214,, subtitles_ru_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.9732987880706787,, subtitles_ru_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.972306966781616,, subtitles_ru_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.97151255607605,, subtitles_ru_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.9718263149261475,, subtitles_ru_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.973245859146118,, subtitles_ru_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.9723284244537354,, subtitles_ru_no_literal,3,10,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.9733688831329346,, subtitles_ru_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.3929569721221924,, subtitles_ru_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.392943859100342,, subtitles_ru_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.392956256866455,, subtitles_ru_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4027605056762695,, subtitles_ru_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.3976504802703857,, subtitles_ru_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.399548053741455,, subtitles_ru_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.39271879196167,, subtitles_ru_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.3926007747650146,, subtitles_ru_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.3937296867370605,, subtitles_ru_no_literal,3,10,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.3968875408172607,, subtitles_ru_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.012164831161499,, subtitles_ru_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.016608953475952,, subtitles_ru_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.0102171897888184,, subtitles_ru_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.000244379043579,, subtitles_ru_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.0036542415618896,, subtitles_ru_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.002727508544922,, subtitles_ru_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.000943660736084,, subtitles_ru_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.0042483806610107,, subtitles_ru_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.0024917125701904,, subtitles_ru_no_literal,3,10,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,3.007298707962036,, subtitles_ru_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.488464593887329,,LC_ALL=C subtitles_ru_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4832253456115723,,LC_ALL=C subtitles_ru_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4868624210357666,,LC_ALL=C subtitles_ru_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.482663631439209,,LC_ALL=C subtitles_ru_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4814178943634033,,LC_ALL=C subtitles_ru_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4921915531158447,,LC_ALL=C subtitles_ru_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.477674722671509,,LC_ALL=C subtitles_ru_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4839584827423096,,LC_ALL=C subtitles_ru_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4775733947753906,,LC_ALL=C subtitles_ru_no_literal,3,10,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4787662029266357,,LC_ALL=C subtitles_ru_surrounding_words,3,10,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9554853439331055,278, subtitles_ru_surrounding_words,3,10,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9573261737823486,278, subtitles_ru_surrounding_words,3,10,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9586184024810791,278, subtitles_ru_surrounding_words,3,10,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9581241607666016,278, subtitles_ru_surrounding_words,3,10,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9575743675231934,278, subtitles_ru_surrounding_words,3,10,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9565131664276123,278, subtitles_ru_surrounding_words,3,10,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.957273006439209,278, subtitles_ru_surrounding_words,3,10,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9568536281585693,278, subtitles_ru_surrounding_words,3,10,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.9590330123901367,278, subtitles_ru_surrounding_words,3,10,rg,rg -n \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,0.956944465637207,278, subtitles_ru_surrounding_words,3,10,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6629645824432373,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,3,10,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6628422737121582,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,3,10,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6596570014953613,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,3,10,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6606900691986084,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,3,10,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6575767993927002,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,3,10,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6601543426513672,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,3,10,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6579883098602295,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,3,10,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6584765911102295,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,3,10,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6587963104248047,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,3,10,grep,grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6574666500091553,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.410092353820801,, subtitles_ru_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4107093811035156,, subtitles_ru_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4124505519866943,, subtitles_ru_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.41247820854187,, subtitles_ru_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4112393856048584,, subtitles_ru_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4098284244537354,, subtitles_ru_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4091367721557617,, subtitles_ru_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4103705883026123,, subtitles_ru_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.409790515899658,, subtitles_ru_surrounding_words,3,10,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.4096734523773193,, subtitles_ru_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.9796345233917236,, subtitles_ru_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.9837162494659424,, subtitles_ru_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.9813201427459717,, subtitles_ru_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.979423999786377,, subtitles_ru_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.976318120956421,, subtitles_ru_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.9775450229644775,, subtitles_ru_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.976980447769165,, subtitles_ru_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.979104518890381,, subtitles_ru_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.980332612991333,, subtitles_ru_surrounding_words,3,10,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,2.9827349185943604,, subtitles_ru_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.60090970993042,,LC_ALL=C subtitles_ru_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.5965259075164795,,LC_ALL=C subtitles_ru_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.5928871631622314,,LC_ALL=C subtitles_ru_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.5957767963409424,,LC_ALL=C subtitles_ru_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.5944275856018066,,LC_ALL=C subtitles_ru_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.6034324169158936,,LC_ALL=C subtitles_ru_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.5949978828430176,,LC_ALL=C subtitles_ru_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.5950729846954346,,LC_ALL=C subtitles_ru_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.593465805053711,,LC_ALL=C subtitles_ru_surrounding_words,3,10,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /mnt/bench/subtitles/OpenSubtitles2016.raw.ru,1.5951871871948242,,LC_ALL=C ripgrep-11.0.2/benchsuite/runs/2016-09-20-ubuntu1604-ec2/summary010064400017500000144000000252711303150153100215560ustar0000000000000000linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------- rg (ignore) 0.351 +/- 0.074 (lines: 68) ag (ignore) 1.747 +/- 0.005 (lines: 68) git grep (ignore) 0.501 +/- 0.003 (lines: 68) rg (whitelist)* 0.216 +/- 0.031 (lines: 68) ucg (whitelist) 0.214 +/- 0.008 (lines: 68)* linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------------- rg (ignore) 0.391 +/- 0.078 (lines: 160) ag (ignore) 1.968 +/- 0.009 (lines: 160) git grep (ignore) 2.018 +/- 0.006 (lines: 160) rg (whitelist)* 0.222 +/- 0.001 (lines: 160)* ucg (whitelist) 0.522 +/- 0.002 (lines: 160) linux_literal (pattern: PM_RESUME) ---------------------------------- rg (ignore) 0.334 +/- 0.053 (lines: 16) rg (ignore) (mmap) 1.611 +/- 0.009 (lines: 16) ag (ignore) (mmap) 1.588 +/- 0.011 (lines: 16) pt (ignore) 0.456 +/- 0.025 (lines: 16) sift (ignore) 0.630 +/- 0.004 (lines: 16) git grep (ignore) 0.345 +/- 0.007 (lines: 16) rg (whitelist)* 0.228 +/- 0.042 (lines: 16) ucg (whitelist) 0.218 +/- 0.007 (lines: 16)* linux_literal_casei (pattern: PM_RESUME) ---------------------------------------- rg (ignore) 0.345 +/- 0.073 (lines: 370) rg (ignore) (mmap) 1.612 +/- 0.011 (lines: 370) ag (ignore) (mmap) 1.609 +/- 0.015 (lines: 370) pt (ignore) 17.204 +/- 0.126 (lines: 370) sift (ignore) 0.805 +/- 0.005 (lines: 370) git grep (ignore) 0.343 +/- 0.007 (lines: 370) rg (whitelist)* 0.222 +/- 0.021 (lines: 370) ucg (whitelist) 0.217 +/- 0.006 (lines: 370)* linux_literal_default (pattern: PM_RESUME) ------------------------------------------ rg 0.349 +/- 0.104 (lines: 16) ag 1.589 +/- 0.009 (lines: 16) ucg* 0.218 +/- 0.007 (lines: 16)* pt 0.462 +/- 0.012 (lines: 16) sift 0.352 +/- 0.018 (lines: 16) git grep 0.342 +/- 0.005 (lines: 16) linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ----------------------------------------------------------------- rg (ignore) 0.577 +/- 0.003 (lines: 490) rg (ignore) (ASCII) 0.416 +/- 0.025 (lines: 490) ag (ignore) (ASCII) 2.339 +/- 0.010 (lines: 766) pt (ignore) (ASCII) 22.066 +/- 0.057 (lines: 490) sift (ignore) (ASCII) 25.563 +/- 0.108 (lines: 490) git grep (ignore) 26.382 +/- 0.044 (lines: 490) git grep (ignore) (ASCII) 4.153 +/- 0.010 (lines: 490) rg (whitelist) 0.503 +/- 0.011 (lines: 419) rg (whitelist) (ASCII)* 0.343 +/- 0.038 (lines: 419)* ucg (whitelist) (ASCII) 1.130 +/- 0.003 (lines: 416) linux_re_literal_suffix (pattern: [A-Z]+_RESUME) ------------------------------------------------ rg (ignore) 0.318 +/- 0.034 (lines: 1652) ag (ignore) 1.899 +/- 0.008 (lines: 1652) pt (ignore) 13.713 +/- 0.241 (lines: 1652) sift (ignore) 10.172 +/- 0.186 (lines: 1652) git grep (ignore) 1.108 +/- 0.004 (lines: 1652) rg (whitelist)* 0.221 +/- 0.022 (lines: 1630)* ucg (whitelist) 0.301 +/- 0.001 (lines: 1630) linux_unicode_greek (pattern: \p{Greek}) ---------------------------------------- rg* 0.414 +/- 0.021 (lines: 23)* pt 12.745 +/- 0.166 (lines: 23) sift 7.767 +/- 0.264 (lines: 23) linux_unicode_greek_casei (pattern: \p{Greek}) ---------------------------------------------- rg 0.425 +/- 0.027 (lines: 103) pt 12.612 +/- 0.217 (lines: 23) sift* 0.002 +/- 0.000 (lines: 0)* linux_unicode_word (pattern: \wAh) ---------------------------------- rg (ignore) 0.355 +/- 0.073 (lines: 186) rg (ignore) (ASCII) 0.329 +/- 0.060 (lines: 174) ag (ignore) (ASCII) 1.774 +/- 0.011 (lines: 174) pt (ignore) (ASCII) 14.180 +/- 0.180 (lines: 174) sift (ignore) (ASCII) 11.087 +/- 0.108 (lines: 174) git grep (ignore) 13.045 +/- 0.008 (lines: 186) git grep (ignore) (ASCII) 2.991 +/- 0.004 (lines: 174) rg (whitelist) 0.235 +/- 0.031 (lines: 180) rg (whitelist) (ASCII)* 0.225 +/- 0.023 (lines: 168)* ucg (ASCII) 0.229 +/- 0.007 (lines: 168) linux_word (pattern: PM_RESUME) ------------------------------- rg (ignore) 0.362 +/- 0.080 (lines: 6) ag (ignore) 1.603 +/- 0.009 (lines: 6) pt (ignore) 14.417 +/- 0.144 (lines: 6) sift (ignore) 7.840 +/- 0.123 (lines: 6) git grep (ignore) 0.341 +/- 0.005 (lines: 6) rg (whitelist)* 0.220 +/- 0.026 (lines: 6)* ucg (whitelist) 0.221 +/- 0.007 (lines: 6) subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------- rg (lines) 0.619 +/- 0.001 (lines: 848) ag (lines) 3.757 +/- 0.001 (lines: 848) ucg (lines) 1.479 +/- 0.002 (lines: 848) grep (lines) 3.412 +/- 0.004 (lines: 848) rg* 0.294 +/- 0.001 (lines: 848)* grep 2.955 +/- 0.003 (lines: 848) subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------------- ag (ASCII) 5.170 +/- 0.004 (lines: 862) ucg (ASCII) 3.453 +/- 0.005 (lines: 862) grep (ASCII) 4.537 +/- 0.025 (lines: 862) rg* 2.724 +/- 0.002 (lines: 862)* grep 5.125 +/- 0.006 (lines: 862) subtitles_en_literal (pattern: Sherlock Holmes) ----------------------------------------------- rg* 0.268 +/- 0.000 (lines: 629)* rg (no mmap) 0.336 +/- 0.001 (lines: 629) pt 3.433 +/- 0.002 (lines: 629) sift 0.326 +/- 0.002 (lines: 629) grep 0.516 +/- 0.001 (lines: 629) rg (lines) 0.595 +/- 0.001 (lines: 629) ag (lines) 2.730 +/- 0.003 (lines: 629) ucg (lines) 0.745 +/- 0.001 (lines: 629) pt (lines) 3.434 +/- 0.005 (lines: 629) sift (lines) 0.756 +/- 0.002 (lines: 629) grep (lines) 0.969 +/- 0.001 (lines: 629) subtitles_en_literal_casei (pattern: Sherlock Holmes) ----------------------------------------------------- rg* 0.366 +/- 0.001 (lines: 642)* grep 4.084 +/- 0.005 (lines: 642) grep (ASCII) 0.614 +/- 0.001 (lines: 642) rg (lines) 0.696 +/- 0.002 (lines: 642) ag (lines) (ASCII) 2.775 +/- 0.004 (lines: 642) ucg (lines) (ASCII) 0.841 +/- 0.002 (lines: 642) subtitles_en_literal_word (pattern: Sherlock Holmes) ---------------------------------------------------- rg (ASCII) 0.596 +/- 0.001 (lines: 629) ag (ASCII) 2.729 +/- 0.001 (lines: 629) ucg (ASCII) 0.810 +/- 0.002 (lines: 629) grep (ASCII) 0.970 +/- 0.000 (lines: 629) rg* 0.596 +/- 0.001 (lines: 629)* grep 0.972 +/- 0.003 (lines: 629) subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 2.777 +/- 0.003 (lines: 13) rg (ASCII)* 2.541 +/- 0.005 (lines: 13)* ag (ASCII) 10.076 +/- 0.005 (lines: 48) ucg (ASCII) 7.771 +/- 0.004 (lines: 13) grep (ASCII) 4.411 +/- 0.004 (lines: 13) subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+) ------------------------------------------------------------ rg 0.605 +/- 0.000 (lines: 317) grep 1.286 +/- 0.002 (lines: 317) rg (ASCII)* 0.602 +/- 0.000 (lines: 317)* ag (ASCII) 11.663 +/- 0.008 (lines: 323) ucg (ASCII) 4.690 +/- 0.002 (lines: 317) grep (ASCII) 1.276 +/- 0.002 (lines: 317) subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------- rg (lines) 1.902 +/- 0.002 (lines: 691) ag (lines) 5.892 +/- 0.003 (lines: 691) ucg (lines) 2.864 +/- 0.006 (lines: 691) grep (lines) 8.511 +/- 0.005 (lines: 691) rg* 1.300 +/- 0.002 (lines: 691)* grep 7.994 +/- 0.017 (lines: 691) subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------------- ag (ASCII) 5.891 +/- 0.001 (lines: 691) ucg (ASCII)* 2.868 +/- 0.005 (lines: 691)* grep (ASCII) 8.572 +/- 0.009 (lines: 691) rg 4.834 +/- 0.004 (lines: 735) grep 8.729 +/- 0.004 (lines: 735) subtitles_ru_literal (pattern: Шерлок Холмс) -------------------------------------------- rg* 0.325 +/- 0.001 (lines: 583)* rg (no mmap) 0.452 +/- 0.002 (lines: 583) pt 12.917 +/- 0.009 (lines: 583) sift 16.418 +/- 0.008 (lines: 583) grep 0.780 +/- 0.001 (lines: 583) rg (lines) 0.926 +/- 0.001 (lines: 583) ag (lines) 4.481 +/- 0.003 (lines: 583) ucg (lines) 1.889 +/- 0.004 (lines: 583) pt (lines) 12.935 +/- 0.011 (lines: 583) sift (lines) 17.177 +/- 0.010 (lines: 583) grep (lines) 1.300 +/- 0.003 (lines: 583) subtitles_ru_literal_casei (pattern: Шерлок Холмс) -------------------------------------------------- rg 1.131 +/- 0.001 (lines: 604) grep 8.187 +/- 0.006 (lines: 604) grep (ASCII) 0.785 +/- 0.001 (lines: 583) rg (lines) 1.733 +/- 0.002 (lines: 604) ag (lines) (ASCII)* 0.729 +/- 0.001 (lines: 0)* ucg (lines) (ASCII) 1.896 +/- 0.005 (lines: 583) subtitles_ru_literal_word (pattern: Шерлок Холмс) ------------------------------------------------- rg (ASCII)* 0.325 +/- 0.000 (lines: 0)* ag (ASCII) 0.753 +/- 0.001 (lines: 0) ucg (ASCII) 1.891 +/- 0.004 (lines: 583) grep (ASCII) 1.303 +/- 0.004 (lines: 583) rg 0.929 +/- 0.001 (lines: 579) grep 1.304 +/- 0.003 (lines: 579) subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 4.905 +/- 0.003 (lines: 41) rg (ASCII) 3.973 +/- 0.002 (lines: 0) ag (ASCII)* 2.395 +/- 0.004 (lines: 0)* ucg (ASCII) 3.006 +/- 0.005 (lines: 0) grep (ASCII) 2.483 +/- 0.005 (lines: 0) subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+) ----------------------------------------------------------- rg* 0.957 +/- 0.001 (lines: 278)* grep 1.660 +/- 0.002 (lines: 278) ag (ASCII) 2.411 +/- 0.001 (lines: 0) ucg (ASCII) 2.980 +/- 0.002 (lines: 0) grep (ASCII) 1.596 +/- 0.003 (lines: 0) ripgrep-11.0.2/benchsuite/runs/2016-09-22-archlinux-cheetah/raw.csv010064400017500000144000002071331303150153100225350ustar0000000000000000benchmark,warmup_iter,iter,name,command,duration,lines,env linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.16187143325805664,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.15862464904785156,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.15711188316345215,68, linux_alternates,1,3,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5682125091552734,68, linux_alternates,1,3,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.551994800567627,68, linux_alternates,1,3,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5516140460968018,68, linux_alternates,1,3,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.24930572509765625,68,LC_ALL=C linux_alternates,1,3,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.25743985176086426,68,LC_ALL=C linux_alternates,1,3,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.24960589408874512,68,LC_ALL=C linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1039431095123291,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10251975059509277,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10156440734863281,68, linux_alternates,1,3,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.15678954124450684,68, linux_alternates,1,3,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.15236687660217285,68, linux_alternates,1,3,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1554563045501709,68, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.16192197799682617,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.15988397598266602,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1610555648803711,160, linux_alternates_casei,1,3,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.6026794910430908,160, linux_alternates_casei,1,3,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.6083211898803711,160, linux_alternates_casei,1,3,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.674222469329834,160, linux_alternates_casei,1,3,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,1.0635485649108887,160,LC_ALL=C linux_alternates_casei,1,3,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.8944556713104248,160,LC_ALL=C linux_alternates_casei,1,3,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.860692024230957,160,LC_ALL=C linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.11778616905212402,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.11570453643798828,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.13424015045166016,160, linux_alternates_casei,1,3,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2392585277557373,160, linux_alternates_casei,1,3,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2421557903289795,160, linux_alternates_casei,1,3,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2390902042388916,160, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.14362168312072754,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.16165685653686523,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.1725757122039795,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3785591125488281,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3961794376373291,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3924229145050049,16, linux_literal,1,3,ag (ignore) (mmap),ag -s PM_RESUME,0.5462315082550049,16, linux_literal,1,3,ag (ignore) (mmap),ag -s PM_RESUME,0.7240490913391113,16, linux_literal,1,3,ag (ignore) (mmap),ag -s PM_RESUME,0.4528837203979492,16, linux_literal,1,3,pt (ignore),pt PM_RESUME,0.16354584693908691,16, linux_literal,1,3,pt (ignore),pt PM_RESUME,0.15301966667175293,16, linux_literal,1,3,pt (ignore),pt PM_RESUME,0.15467524528503418,16, linux_literal,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.33901119232177734,16, linux_literal,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.34641242027282715,16, linux_literal,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.3532230854034424,16, linux_literal,1,3,git grep (ignore),git grep -I -n PM_RESUME,0.1970062255859375,16,LC_ALL=C linux_literal,1,3,git grep (ignore),git grep -I -n PM_RESUME,0.21334624290466309,16,LC_ALL=C linux_literal,1,3,git grep (ignore),git grep -I -n PM_RESUME,0.19323515892028809,16,LC_ALL=C linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.10708379745483398,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.10089921951293945,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.10404157638549805,16, linux_literal,1,3,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.17191362380981445,16, linux_literal,1,3,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.1670548915863037,16, linux_literal,1,3,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.16875147819519043,16, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.16549420356750488,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.14867877960205078,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.1509239673614502,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.38896727561950684,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.39926719665527344,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3912012577056885,370, linux_literal_casei,1,3,ag (ignore) (mmap),ag -i PM_RESUME,0.48294734954833984,370, linux_literal_casei,1,3,ag (ignore) (mmap),ag -i PM_RESUME,0.4827127456665039,370, linux_literal_casei,1,3,ag (ignore) (mmap),ag -i PM_RESUME,0.4216601848602295,370, linux_literal_casei,1,3,pt (ignore),pt -i PM_RESUME,11.884198665618896,370, linux_literal_casei,1,3,pt (ignore),pt -i PM_RESUME,12.05774974822998,370, linux_literal_casei,1,3,pt (ignore),pt -i PM_RESUME,11.864668130874634,370, linux_literal_casei,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.3698842525482178,370, linux_literal_casei,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.3745250701904297,370, linux_literal_casei,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.3670051097869873,370, linux_literal_casei,1,3,git grep (ignore),git grep -I -n -i PM_RESUME,0.18896126747131348,370,LC_ALL=C linux_literal_casei,1,3,git grep (ignore),git grep -I -n -i PM_RESUME,0.19655537605285645,370,LC_ALL=C linux_literal_casei,1,3,git grep (ignore),git grep -I -n -i PM_RESUME,0.183945894241333,370,LC_ALL=C linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.11336517333984375,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.10497522354125977,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.10771870613098145,370, linux_literal_casei,1,3,ucg (whitelist),ucg -i PM_RESUME,0.1626441478729248,370, linux_literal_casei,1,3,ucg (whitelist),ucg -i PM_RESUME,0.16270971298217773,370, linux_literal_casei,1,3,ucg (whitelist),ucg -i PM_RESUME,0.1596980094909668,370, linux_literal_default,1,3,rg,rg PM_RESUME,0.14002084732055664,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.13782882690429688,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.13794231414794922,16, linux_literal_default,1,3,ag,ag PM_RESUME,0.4623262882232666,16, linux_literal_default,1,3,ag,ag PM_RESUME,0.419907808303833,16, linux_literal_default,1,3,ag,ag PM_RESUME,0.44193005561828613,16, linux_literal_default,1,3,ucg,ucg PM_RESUME,0.1634502410888672,16, linux_literal_default,1,3,ucg,ucg PM_RESUME,0.17029428482055664,16, linux_literal_default,1,3,ucg,ucg PM_RESUME,0.16076922416687012,16, linux_literal_default,1,3,pt,pt PM_RESUME,0.15809178352355957,16, linux_literal_default,1,3,pt,pt PM_RESUME,0.1554114818572998,16, linux_literal_default,1,3,pt,pt PM_RESUME,0.15415430068969727,16, linux_literal_default,1,3,sift,sift PM_RESUME,0.1160738468170166,16, linux_literal_default,1,3,sift,sift PM_RESUME,0.11754369735717773,16, linux_literal_default,1,3,sift,sift PM_RESUME,0.11825299263000488,16, linux_literal_default,1,3,git grep,git grep PM_RESUME,0.18619132041931152,16,LC_ALL=en_US.UTF-8 linux_literal_default,1,3,git grep,git grep PM_RESUME,0.16708111763000488,16,LC_ALL=en_US.UTF-8 linux_literal_default,1,3,git grep,git grep PM_RESUME,0.20236515998840332,16,LC_ALL=en_US.UTF-8 linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.34000611305236816,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.36969494819641113,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3622872829437256,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2572669982910156,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3148176670074463,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3092081546783447,490, linux_no_literal,1,3,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.7651598453521729,766, linux_no_literal,1,3,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.7487096786499023,766, linux_no_literal,1,3,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.7506840229034424,766, linux_no_literal,1,3,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.426137685775757,490, linux_no_literal,1,3,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.454124450683594,490, linux_no_literal,1,3,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.573740243911743,490, linux_no_literal,1,3,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.734328746795654,490, linux_no_literal,1,3,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.95349931716919,490, linux_no_literal,1,3,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.97816801071167,490, linux_no_literal,1,3,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.792009830474854,490,LC_ALL=en_US.UTF-8 linux_no_literal,1,3,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.744960308074951,490,LC_ALL=en_US.UTF-8 linux_no_literal,1,3,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},9.04098892211914,490,LC_ALL=en_US.UTF-8 linux_no_literal,1,3,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.8596012592315674,490,LC_ALL=C linux_no_literal,1,3,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.824751853942871,490,LC_ALL=C linux_no_literal,1,3,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.9543235301971436,490,LC_ALL=C linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.31849026679992676,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3028290271759033,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.31795716285705566,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.22214102745056152,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2748534679412842,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2098088264465332,419, linux_no_literal,1,3,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.4494349956512451,416, linux_no_literal,1,3,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.44551706314086914,416, linux_no_literal,1,3,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.4425935745239258,416, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.19018173217773438,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.1422746181488037,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.14041566848754883,1652, linux_re_literal_suffix,1,3,ag (ignore),ag -s [A-Z]+_RESUME,0.5190994739532471,1652, linux_re_literal_suffix,1,3,ag (ignore),ag -s [A-Z]+_RESUME,0.5290501117706299,1652, linux_re_literal_suffix,1,3,ag (ignore),ag -s [A-Z]+_RESUME,0.5360753536224365,1652, linux_re_literal_suffix,1,3,pt (ignore),pt -e [A-Z]+_RESUME,11.900719404220581,1652, linux_re_literal_suffix,1,3,pt (ignore),pt -e [A-Z]+_RESUME,11.905181646347046,1652, linux_re_literal_suffix,1,3,pt (ignore),pt -e [A-Z]+_RESUME,11.878832817077637,1652, linux_re_literal_suffix,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,3.9338936805725098,1652, linux_re_literal_suffix,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,3.971776247024536,1652, linux_re_literal_suffix,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,4.010965585708618,1652, linux_re_literal_suffix,1,3,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.553400993347168,1652,LC_ALL=C linux_re_literal_suffix,1,3,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.5757920742034912,1652,LC_ALL=C linux_re_literal_suffix,1,3,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.6472165584564209,1652,LC_ALL=C linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.10109567642211914,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.1010751724243164,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.10259413719177246,1630, linux_re_literal_suffix,1,3,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.13558602333068848,1630, linux_re_literal_suffix,1,3,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.13765740394592285,1630, linux_re_literal_suffix,1,3,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.14018011093139648,1630, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.2655603885650635,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.2579922676086426,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.2389824390411377,23, linux_unicode_greek,1,3,pt,pt -e \p{Greek},11.789764881134033,23, linux_unicode_greek,1,3,pt,pt -e \p{Greek},11.717109680175781,23, linux_unicode_greek,1,3,pt,pt -e \p{Greek},11.714937448501587,23, linux_unicode_greek,1,3,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.732529401779175,23, linux_unicode_greek,1,3,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.782707452774048,23, linux_unicode_greek,1,3,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.8073642253875732,23, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.29653406143188477,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.24062681198120117,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.24714946746826172,103, linux_unicode_greek_casei,1,3,pt,pt -i -e \p{Greek},11.754312515258789,23, linux_unicode_greek_casei,1,3,pt,pt -i -e \p{Greek},11.742995500564575,23, linux_unicode_greek_casei,1,3,pt,pt -i -e \p{Greek},11.763852596282959,23, linux_unicode_greek_casei,1,3,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.0018308162689208984,, linux_unicode_greek_casei,1,3,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.0017769336700439453,, linux_unicode_greek_casei,1,3,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.0018434524536132812,, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.19392776489257812,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.14665579795837402,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.15625548362731934,186, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.14500045776367188,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.15199685096740723,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.14606475830078125,174, linux_unicode_word,1,3,ag (ignore) (ASCII),ag -s \wAh,0.47933006286621094,174, linux_unicode_word,1,3,ag (ignore) (ASCII),ag -s \wAh,0.4965095520019531,174, linux_unicode_word,1,3,ag (ignore) (ASCII),ag -s \wAh,0.4971892833709717,174, linux_unicode_word,1,3,pt (ignore) (ASCII),pt -e \wAh,12.043948650360107,174, linux_unicode_word,1,3,pt (ignore) (ASCII),pt -e \wAh,12.024799823760986,174, linux_unicode_word,1,3,pt (ignore) (ASCII),pt -e \wAh,12.032919883728027,174, linux_unicode_word,1,3,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.146677255630493,174, linux_unicode_word,1,3,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.05977988243103,174, linux_unicode_word,1,3,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.246629238128662,174, linux_unicode_word,1,3,git grep (ignore),git grep -E -I -n \wAh,4.401025772094727,186,LC_ALL=en_US.UTF-8 linux_unicode_word,1,3,git grep (ignore),git grep -E -I -n \wAh,4.499484062194824,186,LC_ALL=en_US.UTF-8 linux_unicode_word,1,3,git grep (ignore),git grep -E -I -n \wAh,4.530885934829712,186,LC_ALL=en_US.UTF-8 linux_unicode_word,1,3,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.552142858505249,174,LC_ALL=C linux_unicode_word,1,3,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.4553732872009277,174,LC_ALL=C linux_unicode_word,1,3,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.3407535552978516,174,LC_ALL=C linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.10183477401733398,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.10535907745361328,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.10527634620666504,180, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.10268187522888184,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.10159945487976074,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.09854245185852051,168, linux_unicode_word,1,3,ucg (ASCII),ucg --nosmart-case \wAh,0.17232871055603027,168, linux_unicode_word,1,3,ucg (ASCII),ucg --nosmart-case \wAh,0.17245817184448242,168, linux_unicode_word,1,3,ucg (ASCII),ucg --nosmart-case \wAh,0.1736738681793213,168, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.18302679061889648,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.14654874801635742,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.14666008949279785,6, linux_word,1,3,ag (ignore),ag -s -w PM_RESUME,0.43340468406677246,6, linux_word,1,3,ag (ignore),ag -s -w PM_RESUME,0.4431777000427246,6, linux_word,1,3,ag (ignore),ag -s -w PM_RESUME,0.4939415454864502,6, linux_word,1,3,pt (ignore),pt -w PM_RESUME,12.12212347984314,6, linux_word,1,3,pt (ignore),pt -w PM_RESUME,12.106850862503052,6, linux_word,1,3,pt (ignore),pt -w PM_RESUME,12.119231224060059,6, linux_word,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.3320345878601074,6, linux_word,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.2089524269104004,6, linux_word,1,3,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.34165096282959,6, linux_word,1,3,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.20112895965576172,6,LC_ALL=C linux_word,1,3,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.16607999801635742,6,LC_ALL=C linux_word,1,3,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.2049086093902588,6,LC_ALL=C linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.10440325736999512,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.09853243827819824,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.09580087661743164,6, linux_word,1,3,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.16874432563781738,6, linux_word,1,3,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.16241073608398438,6, linux_word,1,3,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.1621534824371338,6, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5109667778015137,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.662921667098999,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.627272367477417,848, subtitles_en_alternate,1,3,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.4915170669555664,848, subtitles_en_alternate,1,3,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.294611930847168,848, subtitles_en_alternate,1,3,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.475243330001831,848, subtitles_en_alternate,1,3,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.450028419494629,848, subtitles_en_alternate,1,3,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.266982078552246,848, subtitles_en_alternate,1,3,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.429199457168579,848, subtitles_en_alternate,1,3,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.81933856010437,848,LC_ALL=C subtitles_en_alternate,1,3,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.829207420349121,848,LC_ALL=C subtitles_en_alternate,1,3,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.795469284057617,848,LC_ALL=C subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3135373592376709,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.47072267532348633,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3777759075164795,848, subtitles_en_alternate,1,3,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2277214527130127,848,LC_ALL=C subtitles_en_alternate,1,3,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.4641876220703125,848,LC_ALL=C subtitles_en_alternate,1,3,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.4201643466949463,848,LC_ALL=C subtitles_en_alternate_casei,1,3,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.925377368927002,862, subtitles_en_alternate_casei,1,3,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.7743782997131348,862, subtitles_en_alternate_casei,1,3,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.9031031131744385,862, subtitles_en_alternate_casei,1,3,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.902085542678833,862, subtitles_en_alternate_casei,1,3,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.9104111194610596,862, subtitles_en_alternate_casei,1,3,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.9407846927642822,862, subtitles_en_alternate_casei,1,3,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.6935694217681885,862,LC_ALL=C subtitles_en_alternate_casei,1,3,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.7745134830474854,862,LC_ALL=C subtitles_en_alternate_casei,1,3,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.5532472133636475,862,LC_ALL=C subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.3000056743621826,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.46085786819458,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2774720191955566,862, subtitles_en_alternate_casei,1,3,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.183770418167114,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,1,3,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.210017442703247,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,1,3,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.052750587463379,862,LC_ALL=en_US.UTF-8 subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2422008514404297,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18678736686706543,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20187044143676758,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21189618110656738,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21378588676452637,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2638204097747803,629, subtitles_en_literal,1,3,pt,pt -N Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6680185794830322,629, subtitles_en_literal,1,3,pt,pt -N Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7018795013427734,629, subtitles_en_literal,1,3,pt,pt -N Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7135086059570312,629, subtitles_en_literal,1,3,sift,sift Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.33170270919799805,629, subtitles_en_literal,1,3,sift,sift Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3204488754272461,629, subtitles_en_literal,1,3,sift,sift Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3302597999572754,629, subtitles_en_literal,1,3,grep,grep -a Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5119576454162598,629,LC_ALL=C subtitles_en_literal,1,3,grep,grep -a Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.48076844215393066,629,LC_ALL=C subtitles_en_literal,1,3,grep,grep -a Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.6118988990783691,629,LC_ALL=C subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.6149063110351562,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.547245979309082,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5441193580627441,629, subtitles_en_literal,1,3,ag (lines),ag -s Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.990401268005371,629, subtitles_en_literal,1,3,ag (lines),ag -s Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9924650192260742,629, subtitles_en_literal,1,3,ag (lines),ag -s Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.807952642440796,629, subtitles_en_literal,1,3,ucg (lines),ucg --nosmart-case Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.772294282913208,629, subtitles_en_literal,1,3,ucg (lines),ucg --nosmart-case Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8758792877197266,629, subtitles_en_literal,1,3,ucg (lines),ucg --nosmart-case Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8043625354766846,629, subtitles_en_literal,1,3,pt (lines),pt Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5409111976623535,629, subtitles_en_literal,1,3,pt (lines),pt Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.535851001739502,629, subtitles_en_literal,1,3,pt (lines),pt Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6951041221618652,629, subtitles_en_literal,1,3,sift (lines),sift -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7138817310333252,629, subtitles_en_literal,1,3,sift (lines),sift -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.727524995803833,629, subtitles_en_literal,1,3,sift (lines),sift -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7202486991882324,629, subtitles_en_literal,1,3,grep (lines),grep -an Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0228428840637207,629,LC_ALL=C subtitles_en_literal,1,3,grep (lines),grep -an Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.9452800750732422,629,LC_ALL=C subtitles_en_literal,1,3,grep (lines),grep -an Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0286569595336914,629,LC_ALL=C subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.36867737770080566,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.391110897064209,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.42432594299316406,642, subtitles_en_literal_casei,1,3,grep,grep -ai Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.2124955654144287,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,1,3,grep,grep -ai Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.288994789123535,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,1,3,grep,grep -ai Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.2279436588287354,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,1,3,grep (ASCII),grep -E -ai Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5713660717010498,642,LC_ALL=C subtitles_en_literal_casei,1,3,grep (ASCII),grep -E -ai Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5478014945983887,642,LC_ALL=C subtitles_en_literal_casei,1,3,grep (ASCII),grep -E -ai Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5502541065216064,642,LC_ALL=C subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5866222381591797,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5829083919525146,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7458250522613525,642, subtitles_en_literal_casei,1,3,ag (lines) (ASCII),ag -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8324756622314453,642, subtitles_en_literal_casei,1,3,ag (lines) (ASCII),ag -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8361680507659912,642, subtitles_en_literal_casei,1,3,ag (lines) (ASCII),ag -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.017822265625,642, subtitles_en_literal_casei,1,3,ucg (lines) (ASCII),ucg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.9228289127349854,642, subtitles_en_literal_casei,1,3,ucg (lines) (ASCII),ucg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.9356215000152588,642, subtitles_en_literal_casei,1,3,ucg (lines) (ASCII),ucg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.9355306625366211,642, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.46090102195739746,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.41375064849853516,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4181649684906006,629, subtitles_en_literal_word,1,3,ag (ASCII),ag -sw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8445067405700684,629, subtitles_en_literal_word,1,3,ag (ASCII),ag -sw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.805356740951538,629, subtitles_en_literal_word,1,3,ag (ASCII),ag -sw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8274097442626953,629, subtitles_en_literal_word,1,3,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.9036450386047363,629, subtitles_en_literal_word,1,3,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7601873874664307,629, subtitles_en_literal_word,1,3,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7341368198394775,629, subtitles_en_literal_word,1,3,grep (ASCII),grep -anw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.867140531539917,629,LC_ALL=C subtitles_en_literal_word,1,3,grep (ASCII),grep -anw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8452246189117432,629,LC_ALL=C subtitles_en_literal_word,1,3,grep (ASCII),grep -anw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8254234790802002,629,LC_ALL=C subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.39222264289855957,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5510556697845459,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.439284086227417,629, subtitles_en_literal_word,1,3,grep,grep -anw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8688523769378662,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,1,3,grep,grep -anw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0727341175079346,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,1,3,grep,grep -anw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8665497303009033,629,LC_ALL=en_US.UTF-8 subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2950611114501953,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.226304769515991,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.3140387535095215,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.055910587310791,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.032794952392578,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0602478981018066,13, subtitles_en_no_literal,1,3,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,7.566168308258057,48, subtitles_en_no_literal,1,3,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,7.360717535018921,48, subtitles_en_no_literal,1,3,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,7.30781364440918,48, subtitles_en_no_literal,1,3,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,6.13957142829895,13, subtitles_en_no_literal,1,3,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,6.132368564605713,13, subtitles_en_no_literal,1,3,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,5.929611921310425,13, subtitles_en_no_literal,1,3,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.432003974914551,13,LC_ALL=C subtitles_en_no_literal,1,3,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.714038610458374,13,LC_ALL=C subtitles_en_no_literal,1,3,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.6915385723114014,13,LC_ALL=C subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.42601513862609863,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.561565637588501,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5141217708587646,317, subtitles_en_surrounding_words,1,3,grep,grep -E -an \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.3077969551086426,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,1,3,grep,grep -E -an \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1768431663513184,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,1,3,grep,grep -E -an \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0883615016937256,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5061089992523193,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4004178047180176,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5536422729492188,317, subtitles_en_surrounding_words,1,3,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.981522798538208,323, subtitles_en_surrounding_words,1,3,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.83101487159729,323, subtitles_en_surrounding_words,1,3,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,5.025806427001953,323, subtitles_en_surrounding_words,1,3,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.906707286834717,317, subtitles_en_surrounding_words,1,3,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.8826284408569336,317, subtitles_en_surrounding_words,1,3,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.852736711502075,317, subtitles_en_surrounding_words,1,3,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.262470006942749,317,LC_ALL=C subtitles_en_surrounding_words,1,3,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1661438941955566,317,LC_ALL=C subtitles_en_surrounding_words,1,3,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1648437976837158,317,LC_ALL=C subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.79972243309021,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.629694938659668,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.8325402736663818,691, subtitles_ru_alternate,1,3,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,4.124853849411011,691, subtitles_ru_alternate,1,3,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,4.0995543003082275,691, subtitles_ru_alternate,1,3,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,4.105457544326782,691, subtitles_ru_alternate,1,3,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.491947650909424,691, subtitles_ru_alternate,1,3,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.544341802597046,691, subtitles_ru_alternate,1,3,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.6295418739318848,691, subtitles_ru_alternate,1,3,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.948693513870239,691,LC_ALL=C subtitles_ru_alternate,1,3,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.991183280944824,691,LC_ALL=C subtitles_ru_alternate,1,3,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.004202842712402,691,LC_ALL=C subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1708271503448486,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3341143131256104,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3589985370635986,691, subtitles_ru_alternate,1,3,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.3860955238342285,691,LC_ALL=C subtitles_ru_alternate,1,3,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.437295436859131,691,LC_ALL=C subtitles_ru_alternate,1,3,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.34372615814209,691,LC_ALL=C subtitles_ru_alternate_casei,1,3,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,4.100299119949341,691, subtitles_ru_alternate_casei,1,3,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,4.343926668167114,691, subtitles_ru_alternate_casei,1,3,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,4.247299432754517,691, subtitles_ru_alternate_casei,1,3,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.6179757118225098,691, subtitles_ru_alternate_casei,1,3,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.438668727874756,691, subtitles_ru_alternate_casei,1,3,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.6296229362487793,691, subtitles_ru_alternate_casei,1,3,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.816138744354248,691,LC_ALL=C subtitles_ru_alternate_casei,1,3,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.005900859832764,691,LC_ALL=C subtitles_ru_alternate_casei,1,3,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.96263861656189,691,LC_ALL=C subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,4.222437858581543,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,4.260664463043213,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,4.040424823760986,735, subtitles_ru_alternate_casei,1,3,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.112156391143799,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,1,3,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.066831350326538,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,1,3,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.983258962631226,735,LC_ALL=en_US.UTF-8 subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3009657859802246,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.31114768981933594,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3145453929901123,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3670217990875244,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.39557576179504395,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.38857460021972656,583, subtitles_ru_literal,1,3,pt,pt -N Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.653504133224487,583, subtitles_ru_literal,1,3,pt,pt -N Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.440903663635254,583, subtitles_ru_literal,1,3,pt,pt -N Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.604345321655273,583, subtitles_ru_literal,1,3,sift,sift Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.333267450332642,583, subtitles_ru_literal,1,3,sift,sift Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.3738181591033936,583, subtitles_ru_literal,1,3,sift,sift Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.604928970336914,583, subtitles_ru_literal,1,3,grep,grep -a Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7382421493530273,583,LC_ALL=C subtitles_ru_literal,1,3,grep,grep -a Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7205381393432617,583,LC_ALL=C subtitles_ru_literal,1,3,grep,grep -a Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.8509528636932373,583,LC_ALL=C subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6589868068695068,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.857933759689331,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7283596992492676,583, subtitles_ru_literal,1,3,ag (lines),ag -s Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.111611843109131,583, subtitles_ru_literal,1,3,ag (lines),ag -s Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1084604263305664,583, subtitles_ru_literal,1,3,ag (lines),ag -s Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.993370771408081,583, subtitles_ru_literal,1,3,ucg (lines),ucg --nosmart-case Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.8463020324707031,583, subtitles_ru_literal,1,3,ucg (lines),ucg --nosmart-case Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.8160367012023926,583, subtitles_ru_literal,1,3,ucg (lines),ucg --nosmart-case Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9012954235076904,583, subtitles_ru_literal,1,3,pt (lines),pt Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.590208530426025,583, subtitles_ru_literal,1,3,pt (lines),pt Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.712487697601318,583, subtitles_ru_literal,1,3,pt (lines),pt Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.628024339675903,583, subtitles_ru_literal,1,3,sift (lines),sift -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.999194145202637,583, subtitles_ru_literal,1,3,sift (lines),sift -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.639494895935059,583, subtitles_ru_literal,1,3,sift (lines),sift -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.6554951667785645,583, subtitles_ru_literal,1,3,grep (lines),grep -an Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3319404125213623,583,LC_ALL=C subtitles_ru_literal,1,3,grep (lines),grep -an Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3712143898010254,583,LC_ALL=C subtitles_ru_literal,1,3,grep (lines),grep -an Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2382845878601074,583,LC_ALL=C subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2365717887878418,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2306108474731445,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.22041654586792,604, subtitles_ru_literal_casei,1,3,grep,grep -ai Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.636392116546631,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,1,3,grep,grep -ai Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.447664976119995,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,1,3,grep,grep -ai Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.47466516494751,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,1,3,grep (ASCII),grep -E -ai Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.8679373264312744,583,LC_ALL=C subtitles_ru_literal_casei,1,3,grep (ASCII),grep -E -ai Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.8400778770446777,583,LC_ALL=C subtitles_ru_literal_casei,1,3,grep (ASCII),grep -E -ai Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.8912734985351562,583,LC_ALL=C subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.6649067401885986,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.472435712814331,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.5518934726715088,604, subtitles_ru_literal_casei,1,3,ag (lines) (ASCII),ag -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6329071521759033,, subtitles_ru_literal_casei,1,3,ag (lines) (ASCII),ag -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6236186027526855,, subtitles_ru_literal_casei,1,3,ag (lines) (ASCII),ag -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.744124174118042,, subtitles_ru_literal_casei,1,3,ucg (lines) (ASCII),ucg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.842088222503662,583, subtitles_ru_literal_casei,1,3,ucg (lines) (ASCII),ucg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.6797516345977783,583, subtitles_ru_literal_casei,1,3,ucg (lines) (ASCII),ucg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.86281418800354,583, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3059053421020508,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3220036029815674,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3317573070526123,, subtitles_ru_literal_word,1,3,ag (ASCII),ag -sw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.790125846862793,, subtitles_ru_literal_word,1,3,ag (ASCII),ag -sw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.8004007339477539,, subtitles_ru_literal_word,1,3,ag (ASCII),ag -sw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7884745597839355,, subtitles_ru_literal_word,1,3,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.8595643043518066,583, subtitles_ru_literal_word,1,3,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.8338594436645508,583, subtitles_ru_literal_word,1,3,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.6697683334350586,583, subtitles_ru_literal_word,1,3,grep (ASCII),grep -anw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1608448028564453,583,LC_ALL=C subtitles_ru_literal_word,1,3,grep (ASCII),grep -anw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3229436874389648,583,LC_ALL=C subtitles_ru_literal_word,1,3,grep (ASCII),grep -anw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3650012016296387,583,LC_ALL=C subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.840968132019043,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7012484073638916,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6782803535461426,579, subtitles_ru_literal_word,1,3,grep,grep -anw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3308250904083252,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,1,3,grep,grep -anw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2687301635742188,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,1,3,grep,grep -anw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.317870855331421,579,LC_ALL=en_US.UTF-8 subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.8553390502929688,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.6567201614379883,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.6484830379486084,41, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.968876838684082,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.0976366996765137,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.9159646034240723,, subtitles_ru_no_literal,1,3,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.8425374031066895,, subtitles_ru_no_literal,1,3,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0483176708221436,, subtitles_ru_no_literal,1,3,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0838112831115723,, subtitles_ru_no_literal,1,3,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.510307550430298,, subtitles_ru_no_literal,1,3,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.542471408843994,, subtitles_ru_no_literal,1,3,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.5069386959075928,, subtitles_ru_no_literal,1,3,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0888967514038086,,LC_ALL=C subtitles_ru_no_literal,1,3,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.119218349456787,,LC_ALL=C subtitles_ru_no_literal,1,3,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0531933307647705,,LC_ALL=C subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.792813777923584,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.8660504817962646,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.8515620231628418,278, subtitles_ru_surrounding_words,1,3,grep,grep -E -an \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.4405500888824463,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,1,3,grep,grep -E -an \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.6386635303497314,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,1,3,grep,grep -E -an \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.5895426273345947,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,1,3,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.032708168029785,, subtitles_ru_surrounding_words,1,3,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.927478551864624,, subtitles_ru_surrounding_words,1,3,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.019101619720459,, subtitles_ru_surrounding_words,1,3,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.6226632595062256,, subtitles_ru_surrounding_words,1,3,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.5062124729156494,, subtitles_ru_surrounding_words,1,3,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.5160763263702393,, subtitles_ru_surrounding_words,1,3,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.613976240158081,,LC_ALL=C subtitles_ru_surrounding_words,1,3,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.5636706352233887,,LC_ALL=C subtitles_ru_surrounding_words,1,3,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.4378304481506348,,LC_ALL=C ripgrep-11.0.2/benchsuite/runs/2016-09-22-archlinux-cheetah/summary010064400017500000144000000252561303150153100226530ustar0000000000000000linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------- rg (ignore) 0.159 +/- 0.002 (lines: 68) ag (ignore) 0.557 +/- 0.009 (lines: 68) git grep (ignore) 0.252 +/- 0.005 (lines: 68) rg (whitelist)* 0.103 +/- 0.001 (lines: 68)* ucg (whitelist) 0.155 +/- 0.002 (lines: 68) linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------------- rg (ignore) 0.161 +/- 0.001 (lines: 160) ag (ignore) 0.628 +/- 0.040 (lines: 160) git grep (ignore) 0.940 +/- 0.109 (lines: 160) rg (whitelist)* 0.123 +/- 0.010 (lines: 160)* ucg (whitelist) 0.240 +/- 0.002 (lines: 160) linux_literal (pattern: PM_RESUME) ---------------------------------- rg (ignore) 0.159 +/- 0.015 (lines: 16) rg (ignore) (mmap) 0.389 +/- 0.009 (lines: 16) ag (ignore) (mmap) 0.574 +/- 0.138 (lines: 16) pt (ignore) 0.157 +/- 0.006 (lines: 16) sift (ignore) 0.346 +/- 0.007 (lines: 16) git grep (ignore) 0.201 +/- 0.011 (lines: 16) rg (whitelist)* 0.104 +/- 0.003 (lines: 16)* ucg (whitelist) 0.169 +/- 0.002 (lines: 16) linux_literal_casei (pattern: PM_RESUME) ---------------------------------------- rg (ignore) 0.155 +/- 0.009 (lines: 370) rg (ignore) (mmap) 0.393 +/- 0.005 (lines: 370) ag (ignore) (mmap) 0.462 +/- 0.035 (lines: 370) pt (ignore) 11.936 +/- 0.106 (lines: 370) sift (ignore) 0.370 +/- 0.004 (lines: 370) git grep (ignore) 0.190 +/- 0.006 (lines: 370) rg (whitelist)* 0.109 +/- 0.004 (lines: 370)* ucg (whitelist) 0.162 +/- 0.002 (lines: 370) linux_literal_default (pattern: PM_RESUME) ------------------------------------------ rg 0.139 +/- 0.001 (lines: 16) ag 0.441 +/- 0.021 (lines: 16) ucg 0.165 +/- 0.005 (lines: 16) pt 0.156 +/- 0.002 (lines: 16) sift* 0.117 +/- 0.001 (lines: 16)* git grep 0.185 +/- 0.018 (lines: 16) linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ----------------------------------------------------------------- rg (ignore) 0.357 +/- 0.015 (lines: 490) rg (ignore) (ASCII) 0.294 +/- 0.032 (lines: 490) ag (ignore) (ASCII) 0.755 +/- 0.009 (lines: 766) pt (ignore) (ASCII) 12.485 +/- 0.078 (lines: 490) sift (ignore) (ASCII) 8.889 +/- 0.134 (lines: 490) git grep (ignore) 8.859 +/- 0.159 (lines: 490) git grep (ignore) (ASCII) 1.880 +/- 0.067 (lines: 490) rg (whitelist) 0.313 +/- 0.009 (lines: 419) rg (whitelist) (ASCII)* 0.236 +/- 0.035 (lines: 419)* ucg (whitelist) (ASCII) 0.446 +/- 0.003 (lines: 416) linux_re_literal_suffix (pattern: [A-Z]+_RESUME) ------------------------------------------------ rg (ignore) 0.158 +/- 0.028 (lines: 1652) ag (ignore) 0.528 +/- 0.009 (lines: 1652) pt (ignore) 11.895 +/- 0.014 (lines: 1652) sift (ignore) 3.972 +/- 0.039 (lines: 1652) git grep (ignore) 0.592 +/- 0.049 (lines: 1652) rg (whitelist)* 0.102 +/- 0.001 (lines: 1630)* ucg (whitelist) 0.138 +/- 0.002 (lines: 1630) linux_unicode_greek (pattern: \p{Greek}) ---------------------------------------- rg* 0.254 +/- 0.014 (lines: 23)* pt 11.741 +/- 0.043 (lines: 23) sift 2.774 +/- 0.038 (lines: 23) linux_unicode_greek_casei (pattern: \p{Greek}) ---------------------------------------------- rg 0.261 +/- 0.031 (lines: 103) pt 11.754 +/- 0.010 (lines: 23) sift* 0.002 +/- 0.000 (lines: 0)* linux_unicode_word (pattern: \wAh) ---------------------------------- rg (ignore) 0.166 +/- 0.025 (lines: 186) rg (ignore) (ASCII) 0.148 +/- 0.004 (lines: 174) ag (ignore) (ASCII) 0.491 +/- 0.010 (lines: 174) pt (ignore) (ASCII) 12.034 +/- 0.010 (lines: 174) sift (ignore) (ASCII) 4.151 +/- 0.094 (lines: 174) git grep (ignore) 4.477 +/- 0.068 (lines: 186) git grep (ignore) (ASCII) 1.449 +/- 0.106 (lines: 174) rg (whitelist) 0.104 +/- 0.002 (lines: 180) rg (whitelist) (ASCII)* 0.101 +/- 0.002 (lines: 168)* ucg (ASCII) 0.173 +/- 0.001 (lines: 168) linux_word (pattern: PM_RESUME) ------------------------------- rg (ignore) 0.159 +/- 0.021 (lines: 6) ag (ignore) 0.457 +/- 0.032 (lines: 6) pt (ignore) 12.116 +/- 0.008 (lines: 6) sift (ignore) 3.294 +/- 0.074 (lines: 6) git grep (ignore) 0.191 +/- 0.021 (lines: 6) rg (whitelist)* 0.100 +/- 0.004 (lines: 6)* ucg (whitelist) 0.164 +/- 0.004 (lines: 6) subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------- rg (lines) 0.600 +/- 0.079 (lines: 848) ag (lines) 2.420 +/- 0.109 (lines: 848) ucg (lines) 1.382 +/- 0.100 (lines: 848) grep (lines) 2.815 +/- 0.017 (lines: 848) rg* 0.387 +/- 0.079 (lines: 848)* grep 2.371 +/- 0.126 (lines: 848) subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------------- ag (ASCII) 3.868 +/- 0.082 (lines: 862) ucg (ASCII) 2.918 +/- 0.020 (lines: 862) grep (ASCII) 3.674 +/- 0.112 (lines: 862) rg* 2.346 +/- 0.100 (lines: 862)* grep 4.149 +/- 0.084 (lines: 862) subtitles_en_literal (pattern: Sherlock Holmes) ----------------------------------------------- rg* 0.210 +/- 0.029 (lines: 629)* rg (no mmap) 0.230 +/- 0.029 (lines: 629) pt 1.694 +/- 0.024 (lines: 629) sift 0.327 +/- 0.006 (lines: 629) grep 0.535 +/- 0.069 (lines: 629) rg (lines) 0.569 +/- 0.040 (lines: 629) ag (lines) 1.930 +/- 0.106 (lines: 629) ucg (lines) 0.818 +/- 0.053 (lines: 629) pt (lines) 1.591 +/- 0.091 (lines: 629) sift (lines) 0.721 +/- 0.007 (lines: 629) grep (lines) 0.999 +/- 0.047 (lines: 629) subtitles_en_literal_casei (pattern: Sherlock Holmes) ----------------------------------------------------- rg* 0.395 +/- 0.028 (lines: 642)* grep 3.243 +/- 0.040 (lines: 642) grep (ASCII) 0.556 +/- 0.013 (lines: 642) rg (lines) 0.638 +/- 0.093 (lines: 642) ag (lines) (ASCII) 1.895 +/- 0.106 (lines: 642) ucg (lines) (ASCII) 0.931 +/- 0.007 (lines: 642) subtitles_en_literal_word (pattern: Sherlock Holmes) ---------------------------------------------------- rg (ASCII) 0.431 +/- 0.026 (lines: 629)* ag (ASCII) 1.826 +/- 0.020 (lines: 629) ucg (ASCII) 0.799 +/- 0.091 (lines: 629) grep (ASCII) 0.846 +/- 0.021 (lines: 629) rg* 0.461 +/- 0.082 (lines: 629) grep 0.936 +/- 0.118 (lines: 629) subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 2.278 +/- 0.046 (lines: 13) rg (ASCII)* 2.050 +/- 0.015 (lines: 13)* ag (ASCII) 7.412 +/- 0.136 (lines: 48) ucg (ASCII) 6.067 +/- 0.119 (lines: 13) grep (ASCII) 3.613 +/- 0.157 (lines: 13) subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+) ------------------------------------------------------------ rg 0.501 +/- 0.069 (lines: 317) grep 1.191 +/- 0.110 (lines: 317) rg (ASCII)* 0.487 +/- 0.078 (lines: 317)* ag (ASCII) 4.946 +/- 0.102 (lines: 323) ucg (ASCII) 3.881 +/- 0.027 (lines: 317) grep (ASCII) 1.198 +/- 0.056 (lines: 317) subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------- rg (lines) 1.754 +/- 0.109 (lines: 691) ag (lines) 4.110 +/- 0.013 (lines: 691) ucg (lines) 2.555 +/- 0.069 (lines: 691) grep (lines) 6.981 +/- 0.029 (lines: 691) rg* 1.288 +/- 0.102 (lines: 691)* grep 6.389 +/- 0.047 (lines: 691) subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------------- ag (ASCII) 4.231 +/- 0.123 (lines: 691) ucg (ASCII)* 2.562 +/- 0.107 (lines: 691)* grep (ASCII) 6.928 +/- 0.099 (lines: 691) rg 4.175 +/- 0.118 (lines: 735) grep 7.054 +/- 0.065 (lines: 735) subtitles_ru_literal (pattern: Шерлок Холмс) -------------------------------------------- rg* 0.309 +/- 0.007 (lines: 583)* rg (no mmap) 0.384 +/- 0.015 (lines: 583) pt 5.566 +/- 0.111 (lines: 583) sift 6.437 +/- 0.147 (lines: 583) grep 0.770 +/- 0.071 (lines: 583) rg (lines) 0.748 +/- 0.101 (lines: 583) ag (lines) 3.071 +/- 0.067 (lines: 583) ucg (lines) 1.855 +/- 0.043 (lines: 583) pt (lines) 5.644 +/- 0.063 (lines: 583) sift (lines) 6.765 +/- 0.203 (lines: 583) grep (lines) 1.314 +/- 0.068 (lines: 583) subtitles_ru_literal_casei (pattern: Шерлок Холмс) -------------------------------------------------- rg 1.229 +/- 0.008 (lines: 604) grep 6.520 +/- 0.102 (lines: 604) grep (ASCII) 0.866 +/- 0.026 (lines: 583) rg (lines) 1.563 +/- 0.097 (lines: 604) ag (lines) (ASCII)* 0.667 +/- 0.067 (lines: 0)* ucg (lines) (ASCII) 1.795 +/- 0.100 (lines: 583) subtitles_ru_literal_word (pattern: Шерлок Холмс) ------------------------------------------------- rg (ASCII)* 0.320 +/- 0.013 (lines: 0)* ag (ASCII) 0.793 +/- 0.006 (lines: 0) ucg (ASCII) 1.788 +/- 0.103 (lines: 583) grep (ASCII) 1.283 +/- 0.108 (lines: 583) rg 0.740 +/- 0.088 (lines: 579) grep 1.306 +/- 0.033 (lines: 579) subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 3.720 +/- 0.117 (lines: 41) rg (ASCII) 2.994 +/- 0.093 (lines: 0) ag (ASCII)* 1.992 +/- 0.130 (lines: 0)* ucg (ASCII) 2.520 +/- 0.020 (lines: 0) grep (ASCII) 2.087 +/- 0.033 (lines: 0) subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+) ----------------------------------------------------------- rg* 0.837 +/- 0.039 (lines: 278)* grep 1.556 +/- 0.103 (lines: 278) ag (ASCII) 1.993 +/- 0.057 (lines: 0) ucg (ASCII) 2.548 +/- 0.065 (lines: 0) grep (ASCII) 1.538 +/- 0.091 (lines: 0) ripgrep-11.0.2/benchsuite/runs/2016-12-24-archlinux-cheetah-glibc-jemalloc/raw.csv010064400017500000144000000510671351372664100254160ustar0000000000000000benchmark,warmup_iter,iter,name,command,duration,lines,env linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09452986717224121,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08666801452636719,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08859610557556152,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07011771202087402,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06441712379455566,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06532430648803711,68, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10056233406066895,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09930968284606934,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09773039817810059,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07829093933105469,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0827643871307373,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08210110664367676,160, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06728911399841309,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06839728355407715,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.0736091136932373,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3859975337982178,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.38575077056884766,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.4032607078552246,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.0657193660736084,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.058367013931274414,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.05761837959289551,16, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07888174057006836,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.08236145973205566,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07680559158325195,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3796377182006836,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3852665424346924,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.387775182723999,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06758904457092285,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06706357002258301,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.07329010963439941,370, linux_literal_default,1,3,rg,rg PM_RESUME,0.06952190399169922,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.06766009330749512,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.06621623039245605,16, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.29076576232910156,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3039717674255371,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3147861957550049,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16966867446899414,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16578006744384766,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16440153121948242,490, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2742593288421631,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.27411365509033203,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2799038887023926,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15713810920715332,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15285205841064453,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.14862322807312012,419, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.06728196144104004,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.06869316101074219,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07347917556762695,1652, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.05894923210144043,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.0584101676940918,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.05851030349731445,1630, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16553878784179688,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16529393196105957,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16843223571777344,23, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16363120079040527,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16463160514831543,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16590571403503418,103, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07585549354553223,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07546257972717285,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07645726203918457,186, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.0733344554901123,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07160758972167969,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07302546501159668,174, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06922054290771484,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06507658958435059,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06478118896484375,180, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06373715400695801,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06354117393493652,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06615662574768066,168, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07121825218200684,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07050347328186035,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07254600524902344,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06099557876586914,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.061118364334106445,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.062296390533447266,6, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2724471092224121,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.26970720291137695,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2697625160217285,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21796512603759766,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.32093358039855957,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.35228729248046875,848, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2418622970581055,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2306008338928223,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.1873059272766113,862, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22467422485351562,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23565077781677246,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21903586387634277,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19292092323303223,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19452929496765137,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1927196979522705,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28882503509521484,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29108643531799316,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29820847511291504,629, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.32578349113464355,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2801830768585205,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.41840386390686035,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.42424988746643066,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3513953685760498,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.35476160049438477,642, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2841978073120117,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18991756439208984,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.296999454498291,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2810351848602295,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27904558181762695,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28331899642944336,629, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.065884590148926,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9066839218139648,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8898587226867676,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8937196731567383,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8904955387115479,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8846819400787354,13, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2928280830383301,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2243812084197998,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2868325710296631,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2832787036895752,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2892146110534668,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22050261497497559,317, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1501314640045166,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3660097122192383,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3461437225341797,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.281209945678711,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.287156343460083,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2730507850646973,691, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.712820529937744,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7904467582702637,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.657541036605835,735, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.28091931343078613,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2749307155609131,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.27948546409606934,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3499312400817871,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3630790710449219,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.35364317893981934,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36719226837158203,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3705906867980957,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3758120536804199,583, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1964221000671387,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1625583171844482,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1898295879364014,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.168842077255249,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2533905506134033,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2375917434692383,604, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.27202439308166504,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.26978445053100586,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.21065115928649902,, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36217236518859863,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36077117919921875,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2883784770965576,579, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.496169090270996,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.315001964569092,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.3024141788482666,41, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.0939135551452637,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.8922672271728516,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1002702713012695,, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3976116180419922,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.4013686180114746,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3070716857910156,278, ripgrep-11.0.2/benchsuite/runs/2016-12-24-archlinux-cheetah-glibc-jemalloc/summary010064400017500000144000000133511351372664100255220ustar0000000000000000linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------- rg (ignore) 0.090 +/- 0.004 (lines: 68) rg (whitelist)* 0.067 +/- 0.003 (lines: 68)* linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------------- rg (ignore) 0.099 +/- 0.001 (lines: 160) rg (whitelist)* 0.081 +/- 0.002 (lines: 160)* linux_literal (pattern: PM_RESUME) ---------------------------------- rg (ignore) 0.070 +/- 0.003 (lines: 16) rg (ignore) (mmap) 0.392 +/- 0.010 (lines: 16) rg (whitelist)* 0.061 +/- 0.004 (lines: 16)* linux_literal_casei (pattern: PM_RESUME) ---------------------------------------- rg (ignore) 0.079 +/- 0.003 (lines: 370) rg (ignore) (mmap) 0.384 +/- 0.004 (lines: 370) rg (whitelist)* 0.069 +/- 0.003 (lines: 370)* linux_literal_default (pattern: PM_RESUME) ------------------------------------------ rg* 0.068 +/- 0.002 (lines: 16)* linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ----------------------------------------------------------------- rg (ignore) 0.303 +/- 0.012 (lines: 490) rg (ignore) (ASCII) 0.167 +/- 0.003 (lines: 490) rg (whitelist) 0.276 +/- 0.003 (lines: 419) rg (whitelist) (ASCII)* 0.153 +/- 0.004 (lines: 419)* linux_re_literal_suffix (pattern: [A-Z]+_RESUME) ------------------------------------------------ rg (ignore) 0.070 +/- 0.003 (lines: 1652) rg (whitelist)* 0.059 +/- 0.000 (lines: 1630)* linux_unicode_greek (pattern: \p{Greek}) ---------------------------------------- rg* 0.166 +/- 0.002 (lines: 23)* linux_unicode_greek_casei (pattern: \p{Greek}) ---------------------------------------------- rg* 0.165 +/- 0.001 (lines: 103)* linux_unicode_word (pattern: \wAh) ---------------------------------- rg (ignore) 0.076 +/- 0.001 (lines: 186) rg (ignore) (ASCII) 0.073 +/- 0.001 (lines: 174) rg (whitelist) 0.066 +/- 0.002 (lines: 180) rg (whitelist) (ASCII)* 0.064 +/- 0.001 (lines: 168)* linux_word (pattern: PM_RESUME) ------------------------------- rg (ignore) 0.071 +/- 0.001 (lines: 6) rg (whitelist)* 0.061 +/- 0.001 (lines: 6)* subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------- rg (lines) 0.271 +/- 0.002 (lines: 848)* rg* 0.297 +/- 0.070 (lines: 848) subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------------- rg* 2.220 +/- 0.029 (lines: 862)* subtitles_en_literal (pattern: Sherlock Holmes) ----------------------------------------------- rg 0.226 +/- 0.008 (lines: 629) rg (no mmap)* 0.193 +/- 0.001 (lines: 629)* rg (lines) 0.293 +/- 0.005 (lines: 629) subtitles_en_literal_casei (pattern: Sherlock Holmes) ----------------------------------------------------- rg* 0.341 +/- 0.070 (lines: 642)* rg (lines) 0.377 +/- 0.041 (lines: 642) subtitles_en_literal_word (pattern: Sherlock Holmes) ---------------------------------------------------- rg (ASCII)* 0.257 +/- 0.058 (lines: 629)* rg 0.281 +/- 0.002 (lines: 629) subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 1.954 +/- 0.097 (lines: 13) rg (ASCII)* 1.890 +/- 0.005 (lines: 13)* subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+) ------------------------------------------------------------ rg 0.268 +/- 0.038 (lines: 317) rg (ASCII)* 0.264 +/- 0.038 (lines: 317)* subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------- rg (lines)* 1.287 +/- 0.119 (lines: 691) rg 1.280 +/- 0.007 (lines: 691)* subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------------- rg* 3.720 +/- 0.067 (lines: 735)* subtitles_ru_literal (pattern: Шерлок Холмс) -------------------------------------------- rg* 0.278 +/- 0.003 (lines: 583)* rg (no mmap) 0.356 +/- 0.007 (lines: 583) rg (lines) 0.371 +/- 0.004 (lines: 583) subtitles_ru_literal_casei (pattern: Шерлок Холмс) -------------------------------------------------- rg* 1.183 +/- 0.018 (lines: 604)* rg (lines) 1.220 +/- 0.045 (lines: 604) subtitles_ru_literal_word (pattern: Шерлок Холмс) ------------------------------------------------- rg (ASCII)* 0.251 +/- 0.035 (lines: 0)* rg 0.337 +/- 0.042 (lines: 579) subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 3.371 +/- 0.108 (lines: 41) rg (ASCII)* 3.029 +/- 0.118 (lines: 0)* subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+) ----------------------------------------------------------- rg* 0.369 +/- 0.053 (lines: 278)* ripgrep-11.0.2/benchsuite/runs/2016-12-24-archlinux-cheetah-glibc-system/raw.csv010064400017500000144000000510441351372664100251470ustar0000000000000000benchmark,warmup_iter,iter,name,command,duration,lines,env linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09608030319213867,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08815908432006836,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08974266052246094,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06675052642822266,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06632375717163086,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06531620025634766,68, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09764790534973145,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10003781318664551,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10493707656860352,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07940077781677246,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07863998413085938,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07791614532470703,160, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06878829002380371,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06836318969726562,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.07277226448059082,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.379986047744751,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.40039825439453125,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.39777183532714844,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.059081315994262695,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.05873990058898926,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.0586698055267334,16, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07791399955749512,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.0774388313293457,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07851481437683105,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3788566589355469,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.385251522064209,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.38781046867370605,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06934094429016113,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.07142090797424316,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.07115054130554199,370, linux_literal_default,1,3,rg,rg PM_RESUME,0.06683826446533203,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.0690450668334961,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.06625819206237793,16, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2812047004699707,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2557988166809082,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2892444133758545,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16913127899169922,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16315627098083496,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16622567176818848,490, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2771792411804199,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2861213684082031,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2742443084716797,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15151619911193848,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15233445167541504,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1620476245880127,419, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07045555114746094,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07046008110046387,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07087540626525879,1652, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06178712844848633,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.0631401538848877,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.0627889633178711,1630, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16510963439941406,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16919803619384766,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16366028785705566,23, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.17235875129699707,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16506695747375488,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16702055931091309,103, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07636308670043945,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.0767667293548584,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07441020011901855,186, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07776570320129395,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07788562774658203,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07390785217285156,174, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06318306922912598,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06787896156311035,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06569766998291016,180, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06557774543762207,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06389331817626953,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06407284736633301,168, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06868839263916016,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07014894485473633,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06822323799133301,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.05816149711608887,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.0577540397644043,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06107187271118164,6, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.38473939895629883,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2760040760040283,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.366499662399292,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.32836484909057617,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3063969612121582,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3368823528289795,848, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2332417964935303,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0444729328155518,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0396711826324463,862, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.13685226440429688,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1380929946899414,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.13843274116516113,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.192030668258667,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1971268653869629,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2931783199310303,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2777669429779053,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28525233268737793,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22691082954406738,629, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.31324243545532227,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4144246578216553,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.41251444816589355,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.492443323135376,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4691810607910156,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4890565872192383,642, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2987544536590576,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28134918212890625,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29971933364868164,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22062921524047852,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2716941833496094,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2172706127166748,629, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0828537940979004,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8791723251342773,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.079643964767456,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8388440608978271,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8970744609832764,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6844482421875,13, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28177690505981445,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29820775985717773,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2861142158508301,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22010159492492676,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22217011451721191,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2219986915588379,317, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.146566390991211,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3609087467193604,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1496453285217285,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.281858205795288,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.365553855895996,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2781758308410645,691, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.622640609741211,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7452948093414307,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.762295961380005,735, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.27922916412353516,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2578129768371582,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.21048188209533691,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.34738945960998535,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.368546724319458,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.35752224922180176,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2654876708984375,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2697427272796631,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3652024269104004,583, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.178579330444336,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1693329811096191,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.144824504852295,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0454356670379639,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0725409984588623,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2725732326507568,604, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.20514369010925293,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.18602967262268066,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2725963592529297,, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.35959553718566895,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36090755462646484,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.35926032066345215,579, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.509491205215454,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.292212963104248,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.4941117763519287,41, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.0987064838409424,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1049976348876953,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.098233222961426,, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3214902877807617,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.38519954681396484,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3827836513519287,278, ripgrep-11.0.2/benchsuite/runs/2016-12-24-archlinux-cheetah-glibc-system/summary010064400017500000144000000133511351372664100252600ustar0000000000000000linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------- rg (ignore) 0.091 +/- 0.004 (lines: 68) rg (whitelist)* 0.066 +/- 0.001 (lines: 68)* linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------------- rg (ignore) 0.101 +/- 0.004 (lines: 160) rg (whitelist)* 0.079 +/- 0.001 (lines: 160)* linux_literal (pattern: PM_RESUME) ---------------------------------- rg (ignore) 0.070 +/- 0.002 (lines: 16) rg (ignore) (mmap) 0.393 +/- 0.011 (lines: 16) rg (whitelist)* 0.059 +/- 0.000 (lines: 16)* linux_literal_casei (pattern: PM_RESUME) ---------------------------------------- rg (ignore) 0.078 +/- 0.001 (lines: 370) rg (ignore) (mmap) 0.384 +/- 0.005 (lines: 370) rg (whitelist)* 0.071 +/- 0.001 (lines: 370)* linux_literal_default (pattern: PM_RESUME) ------------------------------------------ rg* 0.067 +/- 0.001 (lines: 16)* linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ----------------------------------------------------------------- rg (ignore) 0.275 +/- 0.017 (lines: 490) rg (ignore) (ASCII) 0.166 +/- 0.003 (lines: 490) rg (whitelist) 0.279 +/- 0.006 (lines: 419) rg (whitelist) (ASCII)* 0.155 +/- 0.006 (lines: 419)* linux_re_literal_suffix (pattern: [A-Z]+_RESUME) ------------------------------------------------ rg (ignore) 0.071 +/- 0.000 (lines: 1652) rg (whitelist)* 0.063 +/- 0.001 (lines: 1630)* linux_unicode_greek (pattern: \p{Greek}) ---------------------------------------- rg* 0.166 +/- 0.003 (lines: 23)* linux_unicode_greek_casei (pattern: \p{Greek}) ---------------------------------------------- rg* 0.168 +/- 0.004 (lines: 103)* linux_unicode_word (pattern: \wAh) ---------------------------------- rg (ignore) 0.076 +/- 0.001 (lines: 186) rg (ignore) (ASCII) 0.077 +/- 0.002 (lines: 174) rg (whitelist)* 0.066 +/- 0.002 (lines: 180) rg (whitelist) (ASCII) 0.065 +/- 0.001 (lines: 168)* linux_word (pattern: PM_RESUME) ------------------------------- rg (ignore) 0.069 +/- 0.001 (lines: 6) rg (whitelist)* 0.059 +/- 0.002 (lines: 6)* subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------- rg (lines)* 0.342 +/- 0.058 (lines: 848) rg 0.324 +/- 0.016 (lines: 848)* subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------------- rg* 2.106 +/- 0.110 (lines: 862)* subtitles_en_literal (pattern: Sherlock Holmes) ----------------------------------------------- rg* 0.138 +/- 0.001 (lines: 629)* rg (no mmap) 0.227 +/- 0.057 (lines: 629) rg (lines) 0.263 +/- 0.032 (lines: 629) subtitles_en_literal_casei (pattern: Sherlock Holmes) ----------------------------------------------------- rg* 0.380 +/- 0.058 (lines: 642)* rg (lines) 0.484 +/- 0.013 (lines: 642) subtitles_en_literal_word (pattern: Sherlock Holmes) ---------------------------------------------------- rg (ASCII) 0.293 +/- 0.010 (lines: 629) rg* 0.237 +/- 0.030 (lines: 629)* subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 2.014 +/- 0.117 (lines: 13) rg (ASCII)* 1.807 +/- 0.110 (lines: 13)* subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+) ------------------------------------------------------------ rg 0.289 +/- 0.009 (lines: 317) rg (ASCII)* 0.221 +/- 0.001 (lines: 317)* subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------- rg (lines)* 1.219 +/- 0.123 (lines: 691)* rg 1.309 +/- 0.049 (lines: 691) subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------------- rg* 3.710 +/- 0.076 (lines: 735)* subtitles_ru_literal (pattern: Шерлок Холмс) -------------------------------------------- rg* 0.249 +/- 0.035 (lines: 583)* rg (no mmap) 0.358 +/- 0.011 (lines: 583) rg (lines) 0.300 +/- 0.056 (lines: 583) subtitles_ru_literal_casei (pattern: Шерлок Холмс) -------------------------------------------------- rg 1.164 +/- 0.017 (lines: 604) rg (lines)* 1.130 +/- 0.124 (lines: 604)* subtitles_ru_literal_word (pattern: Шерлок Холмс) ------------------------------------------------- rg (ASCII)* 0.221 +/- 0.045 (lines: 0)* rg 0.360 +/- 0.001 (lines: 579) subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 3.432 +/- 0.121 (lines: 41) rg (ASCII)* 3.101 +/- 0.004 (lines: 0)* subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+) ----------------------------------------------------------- rg* 0.363 +/- 0.036 (lines: 278)* ripgrep-11.0.2/benchsuite/runs/2016-12-24-archlinux-cheetah-musl-jemalloc/raw.csv010064400017500000144000000510641351372664100253130ustar0000000000000000benchmark,warmup_iter,iter,name,command,duration,lines,env linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10048675537109375,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09462523460388184,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0931856632232666,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06952047348022461,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07045698165893555,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06589603424072266,68, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09840559959411621,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0973203182220459,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09747123718261719,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07976746559143066,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07973408699035645,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0842599868774414,160, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06900453567504883,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06771540641784668,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.07333683967590332,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.38510584831237793,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.38396191596984863,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.37463903427124023,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.05757570266723633,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.058022260665893555,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.06006050109863281,16, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07654142379760742,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07764244079589844,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07787275314331055,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.38339757919311523,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.38019704818725586,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3887295722961426,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06747794151306152,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06868124008178711,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06679105758666992,370, linux_literal_default,1,3,rg,rg PM_RESUME,0.07849764823913574,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.08336472511291504,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.06723690032958984,16, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.25814294815063477,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.29274845123291016,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2985391616821289,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16458344459533691,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16898059844970703,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1756742000579834,490, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3002643585205078,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2709066867828369,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2683436870574951,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1489565372467041,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.14751625061035156,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1487743854522705,419, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.06930160522460938,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07447147369384766,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07432723045349121,1652, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06141376495361328,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06345224380493164,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.05813455581665039,1630, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16566061973571777,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.17109084129333496,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16268444061279297,23, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16269755363464355,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16636371612548828,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16133809089660645,103, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07663178443908691,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07986211776733398,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07756590843200684,186, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07402157783508301,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07861495018005371,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07465910911560059,174, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06782341003417969,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06639862060546875,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06768679618835449,180, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06638240814208984,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06481051445007324,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06659054756164551,168, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06744074821472168,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06904149055480957,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07302141189575195,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.05972766876220703,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.0587460994720459,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.05879020690917969,6, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3649451732635498,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.37390756607055664,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3691575527191162,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3192598819732666,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3968648910522461,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.347275972366333,848, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.11361026763916,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9423036575317383,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9265573024749756,862, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21686100959777832,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23349666595458984,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2394559383392334,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2971608638763428,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2950170040130615,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2873063087463379,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2898998260498047,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21834325790405273,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2833542823791504,629, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3961493968963623,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.30686163902282715,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.44585490226745605,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.46064209938049316,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4497091770172119,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.34823131561279297,642, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2819490432739258,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18886327743530273,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28542351722717285,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18991541862487793,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27848052978515625,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21271944046020508,629, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0810630321502686,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0093939304351807,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8533532619476318,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8952853679656982,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7897896766662598,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.893296480178833,13, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19786620140075684,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1896834373474121,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29248762130737305,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2933495044708252,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29410600662231445,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23128199577331543,317, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.343696117401123,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3544535636901855,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3534214496612549,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2638463973999023,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2450191974639893,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2779006958007812,691, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7900640964508057,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.812807321548462,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7412266731262207,735, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2562215328216553,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2781085968017578,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.21145415306091309,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36469101905822754,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.37107086181640625,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.29900336265563965,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3739583492279053,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3521237373352051,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3766622543334961,583, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1903154850006104,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.196908950805664,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1714701652526855,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0471339225769043,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2229478359222412,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1774308681488037,604, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.20592975616455078,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2680799961090088,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.29538846015930176,, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36015796661376953,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3006131649017334,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36701369285583496,579, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.4495208263397217,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.4749486446380615,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.29917049407959,41, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.0949668884277344,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1213910579681396,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.905003070831299,, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.39461803436279297,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3211812973022461,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3848116397857666,278, ripgrep-11.0.2/benchsuite/runs/2016-12-24-archlinux-cheetah-musl-jemalloc/summary010064400017500000144000000133511351372664100254220ustar0000000000000000linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------- rg (ignore) 0.096 +/- 0.004 (lines: 68) rg (whitelist)* 0.069 +/- 0.002 (lines: 68)* linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------------- rg (ignore) 0.098 +/- 0.001 (lines: 160) rg (whitelist)* 0.081 +/- 0.003 (lines: 160)* linux_literal (pattern: PM_RESUME) ---------------------------------- rg (ignore) 0.070 +/- 0.003 (lines: 16) rg (ignore) (mmap) 0.381 +/- 0.006 (lines: 16) rg (whitelist)* 0.059 +/- 0.001 (lines: 16)* linux_literal_casei (pattern: PM_RESUME) ---------------------------------------- rg (ignore) 0.077 +/- 0.001 (lines: 370) rg (ignore) (mmap) 0.384 +/- 0.004 (lines: 370) rg (whitelist)* 0.068 +/- 0.001 (lines: 370)* linux_literal_default (pattern: PM_RESUME) ------------------------------------------ rg* 0.076 +/- 0.008 (lines: 16)* linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ----------------------------------------------------------------- rg (ignore) 0.283 +/- 0.022 (lines: 490) rg (ignore) (ASCII) 0.170 +/- 0.006 (lines: 490) rg (whitelist) 0.280 +/- 0.018 (lines: 419) rg (whitelist) (ASCII)* 0.148 +/- 0.001 (lines: 419)* linux_re_literal_suffix (pattern: [A-Z]+_RESUME) ------------------------------------------------ rg (ignore) 0.073 +/- 0.003 (lines: 1652) rg (whitelist)* 0.061 +/- 0.003 (lines: 1630)* linux_unicode_greek (pattern: \p{Greek}) ---------------------------------------- rg* 0.166 +/- 0.004 (lines: 23)* linux_unicode_greek_casei (pattern: \p{Greek}) ---------------------------------------------- rg* 0.163 +/- 0.003 (lines: 103)* linux_unicode_word (pattern: \wAh) ---------------------------------- rg (ignore) 0.078 +/- 0.002 (lines: 186) rg (ignore) (ASCII) 0.076 +/- 0.002 (lines: 174) rg (whitelist) 0.067 +/- 0.001 (lines: 180) rg (whitelist) (ASCII)* 0.066 +/- 0.001 (lines: 168)* linux_word (pattern: PM_RESUME) ------------------------------- rg (ignore) 0.070 +/- 0.003 (lines: 6) rg (whitelist)* 0.059 +/- 0.001 (lines: 6)* subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------- rg (lines) 0.369 +/- 0.004 (lines: 848) rg* 0.354 +/- 0.039 (lines: 848)* subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------------- rg* 1.994 +/- 0.104 (lines: 862)* subtitles_en_literal (pattern: Sherlock Holmes) ----------------------------------------------- rg* 0.230 +/- 0.012 (lines: 629)* rg (no mmap) 0.293 +/- 0.005 (lines: 629) rg (lines) 0.264 +/- 0.040 (lines: 629) subtitles_en_literal_casei (pattern: Sherlock Holmes) ----------------------------------------------------- rg* 0.383 +/- 0.070 (lines: 642)* rg (lines) 0.420 +/- 0.062 (lines: 642) subtitles_en_literal_word (pattern: Sherlock Holmes) ---------------------------------------------------- rg (ASCII)* 0.252 +/- 0.055 (lines: 629) rg 0.227 +/- 0.046 (lines: 629)* subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 1.981 +/- 0.116 (lines: 13) rg (ASCII)* 1.859 +/- 0.060 (lines: 13)* subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+) ------------------------------------------------------------ rg* 0.227 +/- 0.057 (lines: 317)* rg (ASCII) 0.273 +/- 0.036 (lines: 317) subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------- rg (lines) 1.351 +/- 0.006 (lines: 691) rg* 1.262 +/- 0.016 (lines: 691)* subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------------- rg* 3.781 +/- 0.037 (lines: 735)* subtitles_ru_literal (pattern: Шерлок Холмс) -------------------------------------------- rg* 0.249 +/- 0.034 (lines: 583)* rg (no mmap) 0.345 +/- 0.040 (lines: 583) rg (lines) 0.368 +/- 0.013 (lines: 583) subtitles_ru_literal_casei (pattern: Шерлок Холмс) -------------------------------------------------- rg 1.186 +/- 0.013 (lines: 604) rg (lines)* 1.149 +/- 0.091 (lines: 604)* subtitles_ru_literal_word (pattern: Шерлок Холмс) ------------------------------------------------- rg (ASCII)* 0.256 +/- 0.046 (lines: 0)* rg 0.343 +/- 0.037 (lines: 579) subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 3.408 +/- 0.095 (lines: 41) rg (ASCII)* 3.040 +/- 0.118 (lines: 0)* subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+) ----------------------------------------------------------- rg* 0.367 +/- 0.040 (lines: 278)* ripgrep-11.0.2/benchsuite/runs/2016-12-24-archlinux-cheetah-musl-system/raw.csv010064400017500000144000000510641351372664100250510ustar0000000000000000benchmark,warmup_iter,iter,name,command,duration,lines,env linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09466052055358887,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09342074394226074,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0869603157043457,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06717634201049805,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06487321853637695,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06573486328125,68, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10077238082885742,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10428118705749512,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09920215606689453,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07973098754882812,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07897496223449707,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07888197898864746,160, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06830811500549316,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.0715939998626709,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06830549240112305,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3897213935852051,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.39376020431518555,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3769495487213135,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.060272932052612305,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.058103322982788086,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.06174445152282715,16, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07664990425109863,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07809257507324219,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.08361077308654785,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.38071417808532715,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.37515711784362793,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.38091325759887695,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06704211235046387,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06667947769165039,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06667375564575195,370, linux_literal_default,1,3,rg,rg PM_RESUME,0.06779932975769043,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.06725239753723145,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.06754946708679199,16, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2662222385406494,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.30044007301330566,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.30494165420532227,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.17267060279846191,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16266226768493652,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16399097442626953,490, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.25603818893432617,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.26952672004699707,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2737579345703125,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.14797663688659668,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15069222450256348,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15210580825805664,419, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.06923699378967285,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07373404502868652,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07130026817321777,1652, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.05809664726257324,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06291556358337402,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.062150001525878906,1630, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16234064102172852,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16682648658752441,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.1634657382965088,23, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16612553596496582,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.1632983684539795,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16044902801513672,103, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07571697235107422,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07967901229858398,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07469820976257324,186, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07374238967895508,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07341313362121582,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07449674606323242,174, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06552338600158691,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06324410438537598,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.0665595531463623,180, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06373834609985352,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06749844551086426,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06431031227111816,168, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.0686798095703125,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06870913505554199,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06892633438110352,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.05895066261291504,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06163740158081055,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.058525800704956055,6, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.34538722038269043,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.265763521194458,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.26305389404296875,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20859956741333008,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20516705513000488,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20496821403503418,848, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2090365886688232,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.226768732070923,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.226130962371826,862, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.24144577980041504,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21985626220703125,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21775150299072266,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2918863296508789,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1962728500366211,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19310998916625977,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.26285672187805176,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18955564498901367,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1910560131072998,629, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.40812134742736816,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.31265878677368164,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.31433773040771484,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3256862163543701,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.32616353034973145,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.32959580421447754,642, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27936625480651855,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28154826164245605,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20779705047607422,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.26377248764038086,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2896091938018799,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21306395530700684,629, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0740439891815186,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.875295639038086,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0514187812805176,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6831274032592773,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6856412887573242,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6853716373443604,13, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2878584861755371,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22226691246032715,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.294330358505249,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3013031482696533,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2214052677154541,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19563746452331543,317, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1506719589233398,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.345916509628296,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3316686153411865,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2255687713623047,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0810630321502686,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2861762046813965,691, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.666182279586792,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.730118751525879,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7910759449005127,735, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.265308141708374,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2775256633758545,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.29873085021972656,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3600039482116699,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3705918788909912,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.37277793884277344,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3728773593902588,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2903330326080322,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3601820468902588,583, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1635336875915527,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9739360809326172,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.155383825302124,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2030081748962402,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0454139709472656,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2500181198120117,604, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2797272205352783,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2795555591583252,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2683413028717041,, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2863891124725342,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.35770344734191895,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3524661064147949,579, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.514166831970215,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.4967641830444336,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.2882306575775146,41, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.8897318840026855,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1153793334960938,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.100428581237793,, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.4093492031097412,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.4054989814758301,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3883328437805176,278, ripgrep-11.0.2/benchsuite/runs/2016-12-24-archlinux-cheetah-musl-system/summary010064400017500000144000000133511351372664100251600ustar0000000000000000linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------- rg (ignore) 0.092 +/- 0.004 (lines: 68) rg (whitelist)* 0.066 +/- 0.001 (lines: 68)* linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------------- rg (ignore) 0.101 +/- 0.003 (lines: 160) rg (whitelist)* 0.079 +/- 0.000 (lines: 160)* linux_literal (pattern: PM_RESUME) ---------------------------------- rg (ignore) 0.069 +/- 0.002 (lines: 16) rg (ignore) (mmap) 0.387 +/- 0.009 (lines: 16) rg (whitelist)* 0.060 +/- 0.002 (lines: 16)* linux_literal_casei (pattern: PM_RESUME) ---------------------------------------- rg (ignore) 0.079 +/- 0.004 (lines: 370) rg (ignore) (mmap) 0.379 +/- 0.003 (lines: 370) rg (whitelist)* 0.067 +/- 0.000 (lines: 370)* linux_literal_default (pattern: PM_RESUME) ------------------------------------------ rg* 0.068 +/- 0.000 (lines: 16)* linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ----------------------------------------------------------------- rg (ignore) 0.291 +/- 0.021 (lines: 490) rg (ignore) (ASCII) 0.166 +/- 0.005 (lines: 490) rg (whitelist) 0.266 +/- 0.009 (lines: 419) rg (whitelist) (ASCII)* 0.150 +/- 0.002 (lines: 419)* linux_re_literal_suffix (pattern: [A-Z]+_RESUME) ------------------------------------------------ rg (ignore) 0.071 +/- 0.002 (lines: 1652) rg (whitelist)* 0.061 +/- 0.003 (lines: 1630)* linux_unicode_greek (pattern: \p{Greek}) ---------------------------------------- rg* 0.164 +/- 0.002 (lines: 23)* linux_unicode_greek_casei (pattern: \p{Greek}) ---------------------------------------------- rg* 0.163 +/- 0.003 (lines: 103)* linux_unicode_word (pattern: \wAh) ---------------------------------- rg (ignore) 0.077 +/- 0.003 (lines: 186) rg (ignore) (ASCII) 0.074 +/- 0.001 (lines: 174) rg (whitelist)* 0.065 +/- 0.002 (lines: 180)* rg (whitelist) (ASCII) 0.065 +/- 0.002 (lines: 168) linux_word (pattern: PM_RESUME) ------------------------------- rg (ignore) 0.069 +/- 0.000 (lines: 6) rg (whitelist)* 0.060 +/- 0.002 (lines: 6)* subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------- rg (lines) 0.291 +/- 0.047 (lines: 848) rg* 0.206 +/- 0.002 (lines: 848)* subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------------- rg* 2.221 +/- 0.010 (lines: 862)* subtitles_en_literal (pattern: Sherlock Holmes) ----------------------------------------------- rg 0.226 +/- 0.013 (lines: 629) rg (no mmap) 0.227 +/- 0.056 (lines: 629) rg (lines)* 0.214 +/- 0.042 (lines: 629)* subtitles_en_literal_casei (pattern: Sherlock Holmes) ----------------------------------------------------- rg* 0.345 +/- 0.055 (lines: 642) rg (lines) 0.327 +/- 0.002 (lines: 642)* subtitles_en_literal_word (pattern: Sherlock Holmes) ---------------------------------------------------- rg (ASCII)* 0.256 +/- 0.042 (lines: 629) rg 0.255 +/- 0.039 (lines: 629)* subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 2.000 +/- 0.109 (lines: 13) rg (ASCII)* 1.685 +/- 0.001 (lines: 13)* subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+) ------------------------------------------------------------ rg 0.268 +/- 0.040 (lines: 317) rg (ASCII)* 0.239 +/- 0.055 (lines: 317)* subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------- rg (lines) 1.276 +/- 0.109 (lines: 691) rg* 1.198 +/- 0.105 (lines: 691)* subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------------- rg* 3.729 +/- 0.062 (lines: 735)* subtitles_ru_literal (pattern: Шерлок Холмс) -------------------------------------------- rg* 0.281 +/- 0.017 (lines: 583)* rg (no mmap) 0.368 +/- 0.007 (lines: 583) rg (lines) 0.341 +/- 0.044 (lines: 583) subtitles_ru_literal_casei (pattern: Шерлок Холмс) -------------------------------------------------- rg* 1.098 +/- 0.107 (lines: 604)* rg (lines) 1.166 +/- 0.107 (lines: 604) subtitles_ru_literal_word (pattern: Шерлок Холмс) ------------------------------------------------- rg (ASCII)* 0.276 +/- 0.007 (lines: 0)* rg 0.332 +/- 0.040 (lines: 579) subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 3.433 +/- 0.126 (lines: 41) rg (ASCII)* 3.035 +/- 0.126 (lines: 0)* subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+) ----------------------------------------------------------- rg* 0.401 +/- 0.011 (lines: 278)* ripgrep-11.0.2/benchsuite/runs/2016-12-24-archlinux-cheetah/raw.csv010064400017500000144000000510421351372664100225450ustar0000000000000000benchmark,warmup_iter,iter,name,command,duration,lines,env linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09865546226501465,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08865809440612793,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0934293270111084,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07241153717041016,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06905841827392578,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06687068939208984,68, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1011350154876709,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1053009033203125,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10577726364135742,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0832066535949707,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0812225341796875,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08363056182861328,160, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.07260608673095703,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06956887245178223,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.07262110710144043,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3854484558105469,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3801109790802002,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.38498902320861816,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.06220889091491699,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.059615373611450195,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.06207394599914551,16, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.08192729949951172,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.08037471771240234,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.08067464828491211,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3890647888183594,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3882875442504883,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3826119899749756,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.07255673408508301,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.07240700721740723,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06744766235351562,370, linux_literal_default,1,3,rg,rg PM_RESUME,0.06866455078125,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.06612515449523926,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.06630897521972656,16, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.30286335945129395,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2710304260253906,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.30267834663391113,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16382431983947754,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1649789810180664,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16989731788635254,490, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3308746814727783,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.27356576919555664,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2729830741882324,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16254186630249023,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15763211250305176,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15112638473510742,419, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07556724548339844,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07514452934265137,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.06890320777893066,1652, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.061008453369140625,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06007099151611328,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.058913469314575195,1630, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.1675281524658203,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.1719217300415039,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.1675257682800293,23, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16816997528076172,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16349577903747559,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.1649951934814453,103, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07944488525390625,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.08015990257263184,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07640767097473145,186, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.0741121768951416,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07456159591674805,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07508492469787598,174, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06891131401062012,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.0655059814453125,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06730937957763672,180, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.0630197525024414,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06429147720336914,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06670451164245605,168, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07088422775268555,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06971001625061035,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06918931007385254,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.05994749069213867,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06264781951904297,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.061440467834472656,6, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4529764652252197,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28824853897094727,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.287844181060791,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.34439826011657715,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.34816765785217285,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23656105995178223,848, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.026144027709961,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2452991008758545,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2087535858154297,862, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2194046974182129,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22587895393371582,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22500324249267578,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3005552291870117,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2805304527282715,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.30254316329956055,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2822296619415283,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2205369472503662,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23558998107910156,629, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4217369556427002,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4352266788482666,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3286154270172119,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4068911075592041,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4721720218658447,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.49277544021606445,642, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2922394275665283,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2809920310974121,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2835381031036377,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28315305709838867,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29279136657714844,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29344797134399414,629, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0767383575439453,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0589702129364014,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8731834888458252,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6820619106292725,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8845677375793457,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6996817588806152,13, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2987375259399414,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2955625057220459,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2865116596221924,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27387547492980957,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2899343967437744,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19668984413146973,317, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.4088802337646484,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3826014995574951,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.4164769649505615,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2548110485076904,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.080472707748413,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3337528705596924,691, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.449100971221924,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.747535467147827,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7990715503692627,735, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.21280717849731445,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.18636178970336914,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2740190029144287,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36304640769958496,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3737907409667969,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.37337779998779297,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2974729537963867,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2715010643005371,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36052799224853516,583, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.206491231918335,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.202974557876587,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.195291519165039,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2875757217407227,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2895469665527344,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.277585506439209,604, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2928614616394043,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2610359191894531,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2692301273345947,, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36007237434387207,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.37184953689575195,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3902134895324707,579, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.2949090003967285,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.48958683013916,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.389604091644287,41, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.894768714904785,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.873474359512329,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.088130474090576,, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3918273448944092,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.38251543045043945,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2919657230377197,278, ripgrep-11.0.2/benchsuite/runs/2016-12-24-archlinux-cheetah/summary010064400017500000144000000133511351372664100226600ustar0000000000000000linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------- rg (ignore) 0.094 +/- 0.005 (lines: 68) rg (whitelist)* 0.069 +/- 0.003 (lines: 68)* linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------------- rg (ignore) 0.104 +/- 0.003 (lines: 160) rg (whitelist)* 0.083 +/- 0.001 (lines: 160)* linux_literal (pattern: PM_RESUME) ---------------------------------- rg (ignore) 0.072 +/- 0.002 (lines: 16) rg (ignore) (mmap) 0.384 +/- 0.003 (lines: 16) rg (whitelist)* 0.061 +/- 0.001 (lines: 16)* linux_literal_casei (pattern: PM_RESUME) ---------------------------------------- rg (ignore) 0.081 +/- 0.001 (lines: 370) rg (ignore) (mmap) 0.387 +/- 0.004 (lines: 370) rg (whitelist)* 0.071 +/- 0.003 (lines: 370)* linux_literal_default (pattern: PM_RESUME) ------------------------------------------ rg* 0.067 +/- 0.001 (lines: 16)* linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ----------------------------------------------------------------- rg (ignore) 0.292 +/- 0.018 (lines: 490) rg (ignore) (ASCII) 0.166 +/- 0.003 (lines: 490) rg (whitelist) 0.292 +/- 0.033 (lines: 419) rg (whitelist) (ASCII)* 0.157 +/- 0.006 (lines: 419)* linux_re_literal_suffix (pattern: [A-Z]+_RESUME) ------------------------------------------------ rg (ignore) 0.073 +/- 0.004 (lines: 1652) rg (whitelist)* 0.060 +/- 0.001 (lines: 1630)* linux_unicode_greek (pattern: \p{Greek}) ---------------------------------------- rg* 0.169 +/- 0.003 (lines: 23)* linux_unicode_greek_casei (pattern: \p{Greek}) ---------------------------------------------- rg* 0.166 +/- 0.002 (lines: 103)* linux_unicode_word (pattern: \wAh) ---------------------------------- rg (ignore) 0.079 +/- 0.002 (lines: 186) rg (ignore) (ASCII) 0.075 +/- 0.000 (lines: 174) rg (whitelist) 0.067 +/- 0.002 (lines: 180) rg (whitelist) (ASCII)* 0.065 +/- 0.002 (lines: 168)* linux_word (pattern: PM_RESUME) ------------------------------- rg (ignore) 0.070 +/- 0.001 (lines: 6) rg (whitelist)* 0.061 +/- 0.001 (lines: 6)* subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------- rg (lines) 0.343 +/- 0.095 (lines: 848) rg* 0.310 +/- 0.063 (lines: 848)* subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------------- rg* 2.160 +/- 0.117 (lines: 862)* subtitles_en_literal (pattern: Sherlock Holmes) ----------------------------------------------- rg* 0.223 +/- 0.004 (lines: 629)* rg (no mmap) 0.295 +/- 0.012 (lines: 629) rg (lines) 0.246 +/- 0.032 (lines: 629) subtitles_en_literal_casei (pattern: Sherlock Holmes) ----------------------------------------------------- rg* 0.395 +/- 0.058 (lines: 642)* rg (lines) 0.457 +/- 0.045 (lines: 642) subtitles_en_literal_word (pattern: Sherlock Holmes) ---------------------------------------------------- rg (ASCII)* 0.286 +/- 0.006 (lines: 629)* rg 0.290 +/- 0.006 (lines: 629) subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 2.003 +/- 0.113 (lines: 13) rg (ASCII)* 1.755 +/- 0.112 (lines: 13)* subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+) ------------------------------------------------------------ rg 0.294 +/- 0.006 (lines: 317) rg (ASCII)* 0.253 +/- 0.050 (lines: 317)* subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------- rg (lines) 1.403 +/- 0.018 (lines: 691) rg* 1.223 +/- 0.130 (lines: 691)* subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------------- rg* 3.665 +/- 0.189 (lines: 735)* subtitles_ru_literal (pattern: Шерлок Холмс) -------------------------------------------- rg* 0.224 +/- 0.045 (lines: 583)* rg (no mmap) 0.370 +/- 0.006 (lines: 583) rg (lines) 0.310 +/- 0.046 (lines: 583) subtitles_ru_literal_casei (pattern: Шерлок Холмс) -------------------------------------------------- rg* 1.202 +/- 0.006 (lines: 604)* rg (lines) 1.285 +/- 0.006 (lines: 604) subtitles_ru_literal_word (pattern: Шерлок Холмс) ------------------------------------------------- rg (ASCII)* 0.274 +/- 0.017 (lines: 0)* rg 0.374 +/- 0.015 (lines: 579) subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 3.391 +/- 0.097 (lines: 41) rg (ASCII)* 2.952 +/- 0.118 (lines: 0)* subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+) ----------------------------------------------------------- rg* 0.355 +/- 0.055 (lines: 278)* ripgrep-11.0.2/benchsuite/runs/2016-12-30-archlinux-cheetah/raw.csv010064400017500000144000000510561351372664100225470ustar0000000000000000benchmark,warmup_iter,iter,name,command,duration,lines,env linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09816598892211914,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08965039253234863,68, linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09101128578186035,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07472872734069824,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07628297805786133,68, linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07189559936523438,68, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10288548469543457,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10204243659973145,160, linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1031193733215332,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08190178871154785,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08523178100585938,160, linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07952761650085449,160, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06972551345825195,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.0691523551940918,16, linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06865429878234863,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.39247632026672363,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.4009978771209717,16, linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.40122294425964355,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.062048912048339844,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.05932760238647461,16, linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.058171749114990234,16, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.08261799812316895,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.0780181884765625,370, linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07934045791625977,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.4008915424346924,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3899986743927002,370, linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.39725732803344727,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.07104611396789551,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.0707247257232666,370, linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06864142417907715,370, linux_literal_default,1,3,rg,rg PM_RESUME,0.06764745712280273,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.06994485855102539,16, linux_literal_default,1,3,rg,rg PM_RESUME,0.0682222843170166,16, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.27941250801086426,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.31389880180358887,490, linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.30502963066101074,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16565680503845215,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16579079627990723,490, linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.169691801071167,490, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2969038486480713,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2995884418487549,419, linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.27426910400390625,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15207958221435547,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15367984771728516,419, linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15249848365783691,419, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07145977020263672,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07139325141906738,1652, linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.0708932876586914,1652, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.05987191200256348,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06223797798156738,1630, linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06115579605102539,1630, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16427040100097656,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16524410247802734,23, linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.1664714813232422,23, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16639113426208496,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16803503036499023,103, linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16656923294067383,103, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07580804824829102,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07589507102966309,186, linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07574295997619629,186, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07641291618347168,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07523059844970703,174, linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07748007774353027,174, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06804847717285156,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06720519065856934,180, linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06687021255493164,180, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06528687477111816,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.07101035118103027,168, linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06446981430053711,168, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07159972190856934,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.0695488452911377,6, linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07082796096801758,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06297016143798828,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06128263473510742,6, linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06177973747253418,6, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.36841607093811035,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.30306172370910645,848, subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3288271427154541,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3186373710632324,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23814082145690918,848, subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23152780532836914,848, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2480580806732178,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2288904190063477,862, subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.287020206451416,862, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21738362312316895,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.16032648086547852,629, subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.15392351150512695,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21230578422546387,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27013158798217773,629, subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19994258880615234,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2728753089904785,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23652935028076172,629, subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2579770088195801,629, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3031468391418457,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.40822505950927734,642, subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.38727545738220215,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4260599613189697,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4490511417388916,642, subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.49449872970581055,642, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2707977294921875,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2691836357116699,629, subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.24464011192321777,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22373199462890625,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.25702810287475586,629, subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23047828674316406,629, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.139404773712158,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0484464168548584,13, subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0293972492218018,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.840238094329834,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7812306880950928,13, subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7657690048217773,13, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.26054978370666504,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2869753837585449,317, subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22949600219726562,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21858429908752441,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2064223289489746,317, subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20789289474487305,317, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.313758373260498,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2925219535827637,691, subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3444299697875977,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.264918565750122,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.30733060836792,691, subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1466560363769531,691, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.783818244934082,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.76894474029541,735, subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.788987398147583,735, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2822730541229248,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.25232434272766113,583, subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2563645839691162,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.34694504737854004,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3202054500579834,583, subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3236703872680664,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36035776138305664,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3270585536956787,583, subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3121967315673828,583, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0397696495056152,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.158402442932129,604, subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1158676147460938,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2041549682617188,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1511006355285645,604, subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1794021129608154,604, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.19694828987121582,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.1980271339416504,, subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2128591537475586,, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3568108081817627,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3353869915008545,579, subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3075387477874756,579, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.5629587173461914,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.5984435081481934,41, subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.4725229740142822,41, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.170077323913574,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.064476490020752,, subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.159156084060669,, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3924906253814697,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3874075412750244,278, subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.39940643310546875,278, ripgrep-11.0.2/benchsuite/runs/2016-12-30-archlinux-cheetah/summary010064400017500000144000000133511351372664100226550ustar0000000000000000linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------- rg (ignore) 0.093 +/- 0.005 (lines: 68) rg (whitelist)* 0.074 +/- 0.002 (lines: 68)* linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------------- rg (ignore) 0.103 +/- 0.001 (lines: 160) rg (whitelist)* 0.082 +/- 0.003 (lines: 160)* linux_literal (pattern: PM_RESUME) ---------------------------------- rg (ignore) 0.069 +/- 0.001 (lines: 16) rg (ignore) (mmap) 0.398 +/- 0.005 (lines: 16) rg (whitelist)* 0.060 +/- 0.002 (lines: 16)* linux_literal_casei (pattern: PM_RESUME) ---------------------------------------- rg (ignore) 0.080 +/- 0.002 (lines: 370) rg (ignore) (mmap) 0.396 +/- 0.006 (lines: 370) rg (whitelist)* 0.070 +/- 0.001 (lines: 370)* linux_literal_default (pattern: PM_RESUME) ------------------------------------------ rg* 0.069 +/- 0.001 (lines: 16)* linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ----------------------------------------------------------------- rg (ignore) 0.299 +/- 0.018 (lines: 490) rg (ignore) (ASCII) 0.167 +/- 0.002 (lines: 490) rg (whitelist) 0.290 +/- 0.014 (lines: 419) rg (whitelist) (ASCII)* 0.153 +/- 0.001 (lines: 419)* linux_re_literal_suffix (pattern: [A-Z]+_RESUME) ------------------------------------------------ rg (ignore) 0.071 +/- 0.000 (lines: 1652) rg (whitelist)* 0.061 +/- 0.001 (lines: 1630)* linux_unicode_greek (pattern: \p{Greek}) ---------------------------------------- rg* 0.165 +/- 0.001 (lines: 23)* linux_unicode_greek_casei (pattern: \p{Greek}) ---------------------------------------------- rg* 0.167 +/- 0.001 (lines: 103)* linux_unicode_word (pattern: \wAh) ---------------------------------- rg (ignore) 0.076 +/- 0.000 (lines: 186) rg (ignore) (ASCII) 0.076 +/- 0.001 (lines: 174) rg (whitelist) 0.067 +/- 0.001 (lines: 180) rg (whitelist) (ASCII)* 0.067 +/- 0.004 (lines: 168)* linux_word (pattern: PM_RESUME) ------------------------------- rg (ignore) 0.071 +/- 0.001 (lines: 6) rg (whitelist)* 0.062 +/- 0.001 (lines: 6)* subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------- rg (lines) 0.333 +/- 0.033 (lines: 848) rg* 0.263 +/- 0.048 (lines: 848)* subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------------- rg* 2.255 +/- 0.030 (lines: 862)* subtitles_en_literal (pattern: Sherlock Holmes) ----------------------------------------------- rg* 0.177 +/- 0.035 (lines: 629)* rg (no mmap) 0.227 +/- 0.037 (lines: 629) rg (lines) 0.256 +/- 0.018 (lines: 629) subtitles_en_literal_casei (pattern: Sherlock Holmes) ----------------------------------------------------- rg* 0.366 +/- 0.056 (lines: 642)* rg (lines) 0.457 +/- 0.035 (lines: 642) subtitles_en_literal_word (pattern: Sherlock Holmes) ---------------------------------------------------- rg (ASCII) 0.262 +/- 0.015 (lines: 629) rg* 0.237 +/- 0.018 (lines: 629)* subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 2.072 +/- 0.059 (lines: 13) rg (ASCII)* 1.796 +/- 0.039 (lines: 13)* subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+) ------------------------------------------------------------ rg 0.259 +/- 0.029 (lines: 317) rg (ASCII)* 0.211 +/- 0.007 (lines: 317)* subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------- rg (lines) 1.317 +/- 0.026 (lines: 691) rg* 1.240 +/- 0.083 (lines: 691)* subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------------- rg* 3.781 +/- 0.010 (lines: 735)* subtitles_ru_literal (pattern: Шерлок Холмс) -------------------------------------------- rg* 0.264 +/- 0.016 (lines: 583)* rg (no mmap) 0.330 +/- 0.015 (lines: 583) rg (lines) 0.333 +/- 0.025 (lines: 583) subtitles_ru_literal_casei (pattern: Шерлок Холмс) -------------------------------------------------- rg* 1.105 +/- 0.060 (lines: 604)* rg (lines) 1.178 +/- 0.027 (lines: 604) subtitles_ru_literal_word (pattern: Шерлок Холмс) ------------------------------------------------- rg (ASCII)* 0.203 +/- 0.009 (lines: 0)* rg 0.333 +/- 0.025 (lines: 579) subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 3.545 +/- 0.065 (lines: 41) rg (ASCII)* 3.131 +/- 0.058 (lines: 0)* subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+) ----------------------------------------------------------- rg* 0.393 +/- 0.006 (lines: 278)* ripgrep-11.0.2/benchsuite/runs/2018-01-08-archlinux-cheetah/README010064400017500000144000000027341351372666500221330ustar0000000000000000This directory contains updated benchmarks as of 2018-01-08. They were captured via the benchsuite script at `benchsuite/benchsuite` from the root of this repository. The command that was run: $ ./benchsuite \ --dir /tmp/benchsuite \ --raw runs/2018-01-08-archlinux-cheetah/raw.csv \ --warmup-iter 1 \ --bench-iter 5 These results are most directly comparable to the `2016-09-22-archlinux-cheetah` run in the parent directory. The versions of each tool are as follows: $ grep -V grep (GNU grep) 3.1 $ ag -V ag version 2.1.0 Features: +jit +lzma +zlib $ sift -V sift 0.8.0 (linux/amd64) built from commit 2ca94717 (which seems to be 0.9.0) $ pt --version pt version 2.1.4 $ ucg -V UniversalCodeGrep 0.3.3 [...] Build info Repo version: 0.3.3-251-g9b5a3e3 Compiler info: Name ($(CXX)): "g++ -std=gnu++1z" Version string: "g++ (GCC) 7.2.1 20171224" ISA extensions in use: sse4.2: yes popcnt: yes libpcre info: Not linked against libpcre. libpcre2-8 info: Version: 10.30 2017-08-14 JIT support built in?: yes JIT target architecture: x86 64bit (little endian + unaligned) Newline style: LF The version of ripgrep was compiled from source on commit 85d463c0, with the simd-accel and avx-accel features enabled: $ export RUSTFLAGS="-C target-cpu=native" $ cargo build --release --features 'simd-accel avx-accel' ripgrep-11.0.2/benchsuite/runs/2018-01-08-archlinux-cheetah/raw.csv010064400017500000144000003403731351372666500225650ustar0000000000000000benchmark,warmup_iter,iter,name,command,duration,lines,env linux_alternates,1,5,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10186767578125,68, linux_alternates,1,5,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10199356079101562,68, linux_alternates,1,5,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09750819206237793,68, linux_alternates,1,5,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09634733200073242,68, linux_alternates,1,5,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10117292404174805,68, linux_alternates,1,5,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.49642109870910645,68, linux_alternates,1,5,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.48993706703186035,68, linux_alternates,1,5,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.4837028980255127,68, linux_alternates,1,5,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.4773833751678467,68, linux_alternates,1,5,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.558436393737793,68, linux_alternates,1,5,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2605454921722412,68,LC_ALL=C linux_alternates,1,5,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.26748204231262207,68,LC_ALL=C linux_alternates,1,5,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.26719212532043457,68,LC_ALL=C linux_alternates,1,5,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2719383239746094,68,LC_ALL=C linux_alternates,1,5,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.26963257789611816,68,LC_ALL=C linux_alternates,1,5,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08797001838684082,68, linux_alternates,1,5,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09073781967163086,68, linux_alternates,1,5,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0914468765258789,68, linux_alternates,1,5,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09071612358093262,68, linux_alternates,1,5,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0914316177368164,68, linux_alternates,1,5,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1372535228729248,68, linux_alternates,1,5,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.13880419731140137,68, linux_alternates,1,5,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.13315439224243164,68, linux_alternates,1,5,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1367807388305664,68, linux_alternates,1,5,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.13135552406311035,68, linux_alternates_casei,1,5,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.12781810760498047,160, linux_alternates_casei,1,5,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.11988544464111328,160, linux_alternates_casei,1,5,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1205439567565918,160, linux_alternates_casei,1,5,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.12867259979248047,160, linux_alternates_casei,1,5,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1215970516204834,160, linux_alternates_casei,1,5,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5444357395172119,160, linux_alternates_casei,1,5,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5511739253997803,160, linux_alternates_casei,1,5,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5382294654846191,160, linux_alternates_casei,1,5,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5499558448791504,160, linux_alternates_casei,1,5,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.6376545429229736,160, linux_alternates_casei,1,5,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.9767155647277832,160,LC_ALL=C linux_alternates_casei,1,5,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.920574426651001,160,LC_ALL=C linux_alternates_casei,1,5,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.9352290630340576,160,LC_ALL=C linux_alternates_casei,1,5,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.8866012096405029,160,LC_ALL=C linux_alternates_casei,1,5,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.9189445972442627,160,LC_ALL=C linux_alternates_casei,1,5,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09351730346679688,160, linux_alternates_casei,1,5,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09393739700317383,160, linux_alternates_casei,1,5,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09986448287963867,160, linux_alternates_casei,1,5,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09596824645996094,160, linux_alternates_casei,1,5,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09604883193969727,160, linux_alternates_casei,1,5,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.23943114280700684,160, linux_alternates_casei,1,5,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2587015628814697,160, linux_alternates_casei,1,5,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2543606758117676,160, linux_alternates_casei,1,5,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2490406036376953,160, linux_alternates_casei,1,5,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.24046540260314941,160, linux_literal,1,5,rg (ignore),rg -n PM_RESUME,0.08253765106201172,16, linux_literal,1,5,rg (ignore),rg -n PM_RESUME,0.08176755905151367,16, linux_literal,1,5,rg (ignore),rg -n PM_RESUME,0.08141684532165527,16, linux_literal,1,5,rg (ignore),rg -n PM_RESUME,0.08108830451965332,16, linux_literal,1,5,rg (ignore),rg -n PM_RESUME,0.08082938194274902,16, linux_literal,1,5,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.6870582103729248,16, linux_literal,1,5,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.807842493057251,16, linux_literal,1,5,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.8129942417144775,16, linux_literal,1,5,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.7582321166992188,16, linux_literal,1,5,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.6869800090789795,16, linux_literal,1,5,ag (ignore) (mmap),ag -s PM_RESUME,0.6534101963043213,16, linux_literal,1,5,ag (ignore) (mmap),ag -s PM_RESUME,0.6020612716674805,16, linux_literal,1,5,ag (ignore) (mmap),ag -s PM_RESUME,0.6712157726287842,16, linux_literal,1,5,ag (ignore) (mmap),ag -s PM_RESUME,0.6267571449279785,16, linux_literal,1,5,ag (ignore) (mmap),ag -s PM_RESUME,0.505136251449585,16, linux_literal,1,5,pt (ignore),pt PM_RESUME,0.21415948867797852,16, linux_literal,1,5,pt (ignore),pt PM_RESUME,0.19318318367004395,16, linux_literal,1,5,pt (ignore),pt PM_RESUME,0.21352124214172363,16, linux_literal,1,5,pt (ignore),pt PM_RESUME,0.18979454040527344,16, linux_literal,1,5,pt (ignore),pt PM_RESUME,0.16629600524902344,16, linux_literal,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.46967077255249023,16, linux_literal,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.46343088150024414,16, linux_literal,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.4723978042602539,16, linux_literal,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.4741063117980957,16, linux_literal,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.4613051414489746,16, linux_literal,1,5,git grep (ignore),git grep -I -n PM_RESUME,0.20196986198425293,16,LC_ALL=C linux_literal,1,5,git grep (ignore),git grep -I -n PM_RESUME,0.18932533264160156,16,LC_ALL=C linux_literal,1,5,git grep (ignore),git grep -I -n PM_RESUME,0.19396305084228516,16,LC_ALL=C linux_literal,1,5,git grep (ignore),git grep -I -n PM_RESUME,0.1952073574066162,16,LC_ALL=C linux_literal,1,5,git grep (ignore),git grep -I -n PM_RESUME,0.20149731636047363,16,LC_ALL=C linux_literal,1,5,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.08270478248596191,16, linux_literal,1,5,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.08414745330810547,16, linux_literal,1,5,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.08627724647521973,16, linux_literal,1,5,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.08978700637817383,16, linux_literal,1,5,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.0836489200592041,16, linux_literal,1,5,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.15774202346801758,16, linux_literal,1,5,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.16005396842956543,16, linux_literal,1,5,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.15743708610534668,16, linux_literal,1,5,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.16156601905822754,16, linux_literal,1,5,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.1557624340057373,16, linux_literal_casei,1,5,rg (ignore),rg -n -i PM_RESUME,0.1028127670288086,374, linux_literal_casei,1,5,rg (ignore),rg -n -i PM_RESUME,0.10258054733276367,374, linux_literal_casei,1,5,rg (ignore),rg -n -i PM_RESUME,0.10902261734008789,374, linux_literal_casei,1,5,rg (ignore),rg -n -i PM_RESUME,0.10802555084228516,374, linux_literal_casei,1,5,rg (ignore),rg -n -i PM_RESUME,0.10153412818908691,374, linux_literal_casei,1,5,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.7902817726135254,374, linux_literal_casei,1,5,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.7985179424285889,374, linux_literal_casei,1,5,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.8208649158477783,374, linux_literal_casei,1,5,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.7937076091766357,374, linux_literal_casei,1,5,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.7936429977416992,374, linux_literal_casei,1,5,ag (ignore) (mmap),ag -i PM_RESUME,0.5215470790863037,374, linux_literal_casei,1,5,ag (ignore) (mmap),ag -i PM_RESUME,0.46518707275390625,374, linux_literal_casei,1,5,ag (ignore) (mmap),ag -i PM_RESUME,0.4467353820800781,374, linux_literal_casei,1,5,ag (ignore) (mmap),ag -i PM_RESUME,0.4595184326171875,374, linux_literal_casei,1,5,ag (ignore) (mmap),ag -i PM_RESUME,0.4531285762786865,374, linux_literal_casei,1,5,pt (ignore),pt -i PM_RESUME,14.187762022018433,374, linux_literal_casei,1,5,pt (ignore),pt -i PM_RESUME,14.178058385848999,374, linux_literal_casei,1,5,pt (ignore),pt -i PM_RESUME,14.096448421478271,374, linux_literal_casei,1,5,pt (ignore),pt -i PM_RESUME,14.190524339675903,374, linux_literal_casei,1,5,pt (ignore),pt -i PM_RESUME,14.231573343276978,374, linux_literal_casei,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.4668574333190918,374, linux_literal_casei,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.46050214767456055,374, linux_literal_casei,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.46228861808776855,374, linux_literal_casei,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.44957947731018066,374, linux_literal_casei,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.4612581729888916,374, linux_literal_casei,1,5,git grep (ignore),git grep -I -n -i PM_RESUME,0.1932981014251709,370,LC_ALL=C linux_literal_casei,1,5,git grep (ignore),git grep -I -n -i PM_RESUME,0.20561552047729492,370,LC_ALL=C linux_literal_casei,1,5,git grep (ignore),git grep -I -n -i PM_RESUME,0.19516706466674805,370,LC_ALL=C linux_literal_casei,1,5,git grep (ignore),git grep -I -n -i PM_RESUME,0.20196247100830078,370,LC_ALL=C linux_literal_casei,1,5,git grep (ignore),git grep -I -n -i PM_RESUME,0.19236421585083008,370,LC_ALL=C linux_literal_casei,1,5,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.09555959701538086,370, linux_literal_casei,1,5,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.09589338302612305,370, linux_literal_casei,1,5,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.09479856491088867,370, linux_literal_casei,1,5,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.09741568565368652,370, linux_literal_casei,1,5,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.10127615928649902,370, linux_literal_casei,1,5,ucg (whitelist),ucg -i PM_RESUME,0.15514039993286133,370, linux_literal_casei,1,5,ucg (whitelist),ucg -i PM_RESUME,0.15668940544128418,370, linux_literal_casei,1,5,ucg (whitelist),ucg -i PM_RESUME,0.15429425239562988,370, linux_literal_casei,1,5,ucg (whitelist),ucg -i PM_RESUME,0.15332818031311035,370, linux_literal_casei,1,5,ucg (whitelist),ucg -i PM_RESUME,0.14861536026000977,370, linux_literal_default,1,5,rg,rg PM_RESUME,0.08931398391723633,16, linux_literal_default,1,5,rg,rg PM_RESUME,0.08717465400695801,16, linux_literal_default,1,5,rg,rg PM_RESUME,0.0879361629486084,16, linux_literal_default,1,5,rg,rg PM_RESUME,0.08688950538635254,16, linux_literal_default,1,5,rg,rg PM_RESUME,0.09138607978820801,16, linux_literal_default,1,5,ag,ag PM_RESUME,0.5342838764190674,16, linux_literal_default,1,5,ag,ag PM_RESUME,0.47187042236328125,16, linux_literal_default,1,5,ag,ag PM_RESUME,0.4456596374511719,16, linux_literal_default,1,5,ag,ag PM_RESUME,0.4507424831390381,16, linux_literal_default,1,5,ag,ag PM_RESUME,0.44472575187683105,16, linux_literal_default,1,5,ucg,ucg PM_RESUME,0.15556907653808594,16, linux_literal_default,1,5,ucg,ucg PM_RESUME,0.1533644199371338,16, linux_literal_default,1,5,ucg,ucg PM_RESUME,0.15392351150512695,16, linux_literal_default,1,5,ucg,ucg PM_RESUME,0.1535196304321289,16, linux_literal_default,1,5,ucg,ucg PM_RESUME,0.15589547157287598,16, linux_literal_default,1,5,pt,pt PM_RESUME,0.2261514663696289,16, linux_literal_default,1,5,pt,pt PM_RESUME,0.2731902599334717,16, linux_literal_default,1,5,pt,pt PM_RESUME,0.2563004493713379,16, linux_literal_default,1,5,pt,pt PM_RESUME,0.2575085163116455,16, linux_literal_default,1,5,pt,pt PM_RESUME,0.1724245548248291,16, linux_literal_default,1,5,sift,sift PM_RESUME,0.13233542442321777,16, linux_literal_default,1,5,sift,sift PM_RESUME,0.1256580352783203,16, linux_literal_default,1,5,sift,sift PM_RESUME,0.12435102462768555,16, linux_literal_default,1,5,sift,sift PM_RESUME,0.1259307861328125,16, linux_literal_default,1,5,sift,sift PM_RESUME,0.12412142753601074,16, linux_literal_default,1,5,git grep,git grep PM_RESUME,0.1742086410522461,16,LC_ALL=en_US.UTF-8 linux_literal_default,1,5,git grep,git grep PM_RESUME,0.16890597343444824,16,LC_ALL=en_US.UTF-8 linux_literal_default,1,5,git grep,git grep PM_RESUME,0.16680669784545898,16,LC_ALL=en_US.UTF-8 linux_literal_default,1,5,git grep,git grep PM_RESUME,0.16899871826171875,16,LC_ALL=en_US.UTF-8 linux_literal_default,1,5,git grep,git grep PM_RESUME,0.19794917106628418,16,LC_ALL=en_US.UTF-8 linux_no_literal,1,5,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.33940672874450684,490, linux_no_literal,1,5,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3274960517883301,490, linux_no_literal,1,5,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.32681775093078613,490, linux_no_literal,1,5,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.32865071296691895,490, linux_no_literal,1,5,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3240926265716553,490, linux_no_literal,1,5,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.17426586151123047,490, linux_no_literal,1,5,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.17265701293945312,490, linux_no_literal,1,5,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1703634262084961,490, linux_no_literal,1,5,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.17192435264587402,490, linux_no_literal,1,5,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1704559326171875,490, linux_no_literal,1,5,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.8443403244018555,766, linux_no_literal,1,5,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.6956703662872314,766, linux_no_literal,1,5,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.6938261985778809,766, linux_no_literal,1,5,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.695967435836792,766, linux_no_literal,1,5,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.6945271492004395,766, linux_no_literal,1,5,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.645716428756714,490, linux_no_literal,1,5,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.441533088684082,490, linux_no_literal,1,5,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.472522735595703,490, linux_no_literal,1,5,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.42497444152832,490, linux_no_literal,1,5,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.407486200332642,490, linux_no_literal,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},9.091489553451538,490, linux_no_literal,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},9.049214124679565,490, linux_no_literal,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.879419803619385,490, linux_no_literal,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},9.07261848449707,490, linux_no_literal,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.918747901916504,490, linux_no_literal,1,5,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.334321975708008,490,LC_ALL=en_US.UTF-8 linux_no_literal,1,5,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.993232727050781,490,LC_ALL=en_US.UTF-8 linux_no_literal,1,5,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.622304916381836,490,LC_ALL=en_US.UTF-8 linux_no_literal,1,5,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.35973048210144,490,LC_ALL=en_US.UTF-8 linux_no_literal,1,5,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.39980435371399,490,LC_ALL=en_US.UTF-8 linux_no_literal,1,5,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.0318400859832764,490,LC_ALL=C linux_no_literal,1,5,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.8587837219238281,490,LC_ALL=C linux_no_literal,1,5,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.873384714126587,490,LC_ALL=C linux_no_literal,1,5,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.8111364841461182,490,LC_ALL=C linux_no_literal,1,5,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.8385357856750488,490,LC_ALL=C linux_no_literal,1,5,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.28792643547058105,458, linux_no_literal,1,5,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.28545212745666504,458, linux_no_literal,1,5,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.28576135635375977,458, linux_no_literal,1,5,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.29883813858032227,458, linux_no_literal,1,5,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.28493285179138184,458, linux_no_literal,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15974783897399902,458, linux_no_literal,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15943312644958496,458, linux_no_literal,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.160233736038208,458, linux_no_literal,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16201996803283691,458, linux_no_literal,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16033530235290527,458, linux_no_literal,1,5,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.4639148712158203,416, linux_no_literal,1,5,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.46042823791503906,416, linux_no_literal,1,5,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.45925426483154297,416, linux_no_literal,1,5,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.477064847946167,416, linux_no_literal,1,5,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.507554292678833,416, linux_re_literal_suffix,1,5,rg (ignore),rg -n [A-Z]+_RESUME,0.08520364761352539,1652, linux_re_literal_suffix,1,5,rg (ignore),rg -n [A-Z]+_RESUME,0.08203816413879395,1652, linux_re_literal_suffix,1,5,rg (ignore),rg -n [A-Z]+_RESUME,0.08355021476745605,1652, linux_re_literal_suffix,1,5,rg (ignore),rg -n [A-Z]+_RESUME,0.0865166187286377,1652, linux_re_literal_suffix,1,5,rg (ignore),rg -n [A-Z]+_RESUME,0.08125448226928711,1652, linux_re_literal_suffix,1,5,ag (ignore),ag -s [A-Z]+_RESUME,0.4846627712249756,1652, linux_re_literal_suffix,1,5,ag (ignore),ag -s [A-Z]+_RESUME,0.48070311546325684,1652, linux_re_literal_suffix,1,5,ag (ignore),ag -s [A-Z]+_RESUME,0.4813041687011719,1652, linux_re_literal_suffix,1,5,ag (ignore),ag -s [A-Z]+_RESUME,0.4755582809448242,1652, linux_re_literal_suffix,1,5,ag (ignore),ag -s [A-Z]+_RESUME,0.4926290512084961,1652, linux_re_literal_suffix,1,5,pt (ignore),pt -e [A-Z]+_RESUME,14.124520540237427,1652, linux_re_literal_suffix,1,5,pt (ignore),pt -e [A-Z]+_RESUME,14.151537656784058,1652, linux_re_literal_suffix,1,5,pt (ignore),pt -e [A-Z]+_RESUME,14.157994270324707,1652, linux_re_literal_suffix,1,5,pt (ignore),pt -e [A-Z]+_RESUME,14.102291822433472,1652, linux_re_literal_suffix,1,5,pt (ignore),pt -e [A-Z]+_RESUME,14.103861093521118,1652, linux_re_literal_suffix,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,4.182392835617065,1652, linux_re_literal_suffix,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,4.190829277038574,1652, linux_re_literal_suffix,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,3.9770240783691406,1652, linux_re_literal_suffix,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,3.9978606700897217,1652, linux_re_literal_suffix,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,4.146454572677612,1652, linux_re_literal_suffix,1,5,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.5080702304840088,1652,LC_ALL=C linux_re_literal_suffix,1,5,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.5281260013580322,1652,LC_ALL=C linux_re_literal_suffix,1,5,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.5350546836853027,1652,LC_ALL=C linux_re_literal_suffix,1,5,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.5474245548248291,1652,LC_ALL=C linux_re_literal_suffix,1,5,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.5256762504577637,1652,LC_ALL=C linux_re_literal_suffix,1,5,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.07924222946166992,1630, linux_re_literal_suffix,1,5,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.0767812728881836,1630, linux_re_literal_suffix,1,5,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.07874488830566406,1630, linux_re_literal_suffix,1,5,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.0804905891418457,1630, linux_re_literal_suffix,1,5,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.07479119300842285,1630, linux_re_literal_suffix,1,5,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.13643193244934082,1630, linux_re_literal_suffix,1,5,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.13543128967285156,1630, linux_re_literal_suffix,1,5,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.13312768936157227,1630, linux_re_literal_suffix,1,5,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.13562273979187012,1630, linux_re_literal_suffix,1,5,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.13236212730407715,1630, linux_unicode_greek,1,5,rg,rg -n \p{Greek},0.17355775833129883,23, linux_unicode_greek,1,5,rg,rg -n \p{Greek},0.1676032543182373,23, linux_unicode_greek,1,5,rg,rg -n \p{Greek},0.1727275848388672,23, linux_unicode_greek,1,5,rg,rg -n \p{Greek},0.17095375061035156,23, linux_unicode_greek,1,5,rg,rg -n \p{Greek},0.17271947860717773,23, linux_unicode_greek,1,5,pt,pt -e \p{Greek},14.14364218711853,23, linux_unicode_greek,1,5,pt,pt -e \p{Greek},14.137334108352661,23, linux_unicode_greek,1,5,pt,pt -e \p{Greek},14.083475351333618,23, linux_unicode_greek,1,5,pt,pt -e \p{Greek},14.095231056213379,23, linux_unicode_greek,1,5,pt,pt -e \p{Greek},14.151906490325928,23, linux_unicode_greek,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.8376963138580322,23, linux_unicode_greek,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.8271427154541016,23, linux_unicode_greek,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.8310961723327637,23, linux_unicode_greek,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.826141595840454,23, linux_unicode_greek,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.805818796157837,23, linux_unicode_greek_casei,1,5,rg,rg -n -i \p{Greek},0.16843819618225098,103, linux_unicode_greek_casei,1,5,rg,rg -n -i \p{Greek},0.1704998016357422,103, linux_unicode_greek_casei,1,5,rg,rg -n -i \p{Greek},0.17055058479309082,103, linux_unicode_greek_casei,1,5,rg,rg -n -i \p{Greek},0.17064881324768066,103, linux_unicode_greek_casei,1,5,rg,rg -n -i \p{Greek},0.1699228286743164,103, linux_unicode_greek_casei,1,5,pt,pt -i -e \p{Greek},14.164355993270874,23, linux_unicode_greek_casei,1,5,pt,pt -i -e \p{Greek},14.099931478500366,23, linux_unicode_greek_casei,1,5,pt,pt -i -e \p{Greek},14.155095338821411,23, linux_unicode_greek_casei,1,5,pt,pt -i -e \p{Greek},14.109308004379272,23, linux_unicode_greek_casei,1,5,pt,pt -i -e \p{Greek},14.072362422943115,23, linux_unicode_greek_casei,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.003945589065551758,, linux_unicode_greek_casei,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.004189729690551758,, linux_unicode_greek_casei,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.0034589767456054688,, linux_unicode_greek_casei,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.003614187240600586,, linux_unicode_greek_casei,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.003975629806518555,, linux_unicode_word,1,5,rg (ignore),rg -n \wAh,0.09798526763916016,186, linux_unicode_word,1,5,rg (ignore),rg -n \wAh,0.09575009346008301,186, linux_unicode_word,1,5,rg (ignore),rg -n \wAh,0.10181760787963867,186, linux_unicode_word,1,5,rg (ignore),rg -n \wAh,0.09650158882141113,186, linux_unicode_word,1,5,rg (ignore),rg -n \wAh,0.09717488288879395,186, linux_unicode_word,1,5,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.09417867660522461,174, linux_unicode_word,1,5,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.09903812408447266,174, linux_unicode_word,1,5,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.09407877922058105,174, linux_unicode_word,1,5,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.09681963920593262,174, linux_unicode_word,1,5,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.09762454032897949,174, linux_unicode_word,1,5,ag (ignore) (ASCII),ag -s \wAh,0.5779609680175781,174, linux_unicode_word,1,5,ag (ignore) (ASCII),ag -s \wAh,0.635645866394043,174, linux_unicode_word,1,5,ag (ignore) (ASCII),ag -s \wAh,0.6109263896942139,174, linux_unicode_word,1,5,ag (ignore) (ASCII),ag -s \wAh,0.6260912418365479,174, linux_unicode_word,1,5,ag (ignore) (ASCII),ag -s \wAh,0.6823546886444092,174, linux_unicode_word,1,5,pt (ignore) (ASCII),pt -e \wAh,14.178487062454224,174, linux_unicode_word,1,5,pt (ignore) (ASCII),pt -e \wAh,14.190000057220459,174, linux_unicode_word,1,5,pt (ignore) (ASCII),pt -e \wAh,14.16363000869751,174, linux_unicode_word,1,5,pt (ignore) (ASCII),pt -e \wAh,14.160430431365967,174, linux_unicode_word,1,5,pt (ignore) (ASCII),pt -e \wAh,14.2189621925354,174, linux_unicode_word,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.17629337310791,174, linux_unicode_word,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.051238059997559,174, linux_unicode_word,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.323853015899658,174, linux_unicode_word,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.085661172866821,174, linux_unicode_word,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.036486625671387,174, linux_unicode_word,1,5,git grep (ignore),git grep -E -I -n \wAh,4.620476961135864,186,LC_ALL=en_US.UTF-8 linux_unicode_word,1,5,git grep (ignore),git grep -E -I -n \wAh,4.536192417144775,186,LC_ALL=en_US.UTF-8 linux_unicode_word,1,5,git grep (ignore),git grep -E -I -n \wAh,4.510494232177734,186,LC_ALL=en_US.UTF-8 linux_unicode_word,1,5,git grep (ignore),git grep -E -I -n \wAh,6.001620769500732,186,LC_ALL=en_US.UTF-8 linux_unicode_word,1,5,git grep (ignore),git grep -E -I -n \wAh,4.602652311325073,186,LC_ALL=en_US.UTF-8 linux_unicode_word,1,5,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.3785994052886963,174,LC_ALL=C linux_unicode_word,1,5,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.4163663387298584,174,LC_ALL=C linux_unicode_word,1,5,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.402677297592163,174,LC_ALL=C linux_unicode_word,1,5,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.3327512741088867,174,LC_ALL=C linux_unicode_word,1,5,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.3501760959625244,174,LC_ALL=C linux_unicode_word,1,5,rg (whitelist),rg -n --no-ignore -tall \wAh,0.07958698272705078,180, linux_unicode_word,1,5,rg (whitelist),rg -n --no-ignore -tall \wAh,0.0798649787902832,180, linux_unicode_word,1,5,rg (whitelist),rg -n --no-ignore -tall \wAh,0.08086204528808594,180, linux_unicode_word,1,5,rg (whitelist),rg -n --no-ignore -tall \wAh,0.0814356803894043,180, linux_unicode_word,1,5,rg (whitelist),rg -n --no-ignore -tall \wAh,0.08273720741271973,180, linux_unicode_word,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.08280825614929199,168, linux_unicode_word,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.08074021339416504,168, linux_unicode_word,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.0821676254272461,168, linux_unicode_word,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.07926368713378906,168, linux_unicode_word,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.08405280113220215,168, linux_unicode_word,1,5,ucg (ASCII),ucg --nosmart-case \wAh,0.1545090675354004,168, linux_unicode_word,1,5,ucg (ASCII),ucg --nosmart-case \wAh,0.1517190933227539,168, linux_unicode_word,1,5,ucg (ASCII),ucg --nosmart-case \wAh,0.15704965591430664,168, linux_unicode_word,1,5,ucg (ASCII),ucg --nosmart-case \wAh,0.15523767471313477,168, linux_unicode_word,1,5,ucg (ASCII),ucg --nosmart-case \wAh,0.1582942008972168,168, linux_word,1,5,rg (ignore),rg -n -w PM_RESUME,0.09102368354797363,6, linux_word,1,5,rg (ignore),rg -n -w PM_RESUME,0.08986210823059082,6, linux_word,1,5,rg (ignore),rg -n -w PM_RESUME,0.08989477157592773,6, linux_word,1,5,rg (ignore),rg -n -w PM_RESUME,0.0895695686340332,6, linux_word,1,5,rg (ignore),rg -n -w PM_RESUME,0.09547114372253418,6, linux_word,1,5,ag (ignore),ag -s -w PM_RESUME,0.4948008060455322,6, linux_word,1,5,ag (ignore),ag -s -w PM_RESUME,0.45710110664367676,6, linux_word,1,5,ag (ignore),ag -s -w PM_RESUME,0.44803452491760254,6, linux_word,1,5,ag (ignore),ag -s -w PM_RESUME,0.44779396057128906,6, linux_word,1,5,ag (ignore),ag -s -w PM_RESUME,0.4563112258911133,6, linux_word,1,5,pt (ignore),pt -w PM_RESUME,14.233235597610474,6, linux_word,1,5,pt (ignore),pt -w PM_RESUME,14.277648687362671,6, linux_word,1,5,pt (ignore),pt -w PM_RESUME,14.218127727508545,6, linux_word,1,5,pt (ignore),pt -w PM_RESUME,14.171622037887573,6, linux_word,1,5,pt (ignore),pt -w PM_RESUME,14.214240312576294,6, linux_word,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.1536731719970703,6, linux_word,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.2415099143981934,6, linux_word,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.2526626586914062,6, linux_word,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.2590816020965576,6, linux_word,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.222473621368408,6, linux_word,1,5,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.16982412338256836,6,LC_ALL=C linux_word,1,5,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.16739583015441895,6,LC_ALL=C linux_word,1,5,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.16866540908813477,6,LC_ALL=C linux_word,1,5,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.18207120895385742,6,LC_ALL=C linux_word,1,5,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.17716264724731445,6,LC_ALL=C linux_word,1,5,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.07490420341491699,6, linux_word,1,5,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.07714152336120605,6, linux_word,1,5,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.07552146911621094,6, linux_word,1,5,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.07651710510253906,6, linux_word,1,5,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.0757131576538086,6, linux_word,1,5,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.1530015468597412,6, linux_word,1,5,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.15152239799499512,6, linux_word,1,5,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.1571195125579834,6, linux_word,1,5,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.15993595123291016,6, linux_word,1,5,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.15633797645568848,6, subtitles_en_alternate,1,5,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.33371877670288086,848, subtitles_en_alternate,1,5,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3207988739013672,848, subtitles_en_alternate,1,5,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3301675319671631,848, subtitles_en_alternate,1,5,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29731154441833496,848, subtitles_en_alternate,1,5,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2711911201477051,848, subtitles_en_alternate,1,5,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.186570405960083,848, subtitles_en_alternate,1,5,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.1659939289093018,848, subtitles_en_alternate,1,5,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.187847137451172,848, subtitles_en_alternate,1,5,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.3522064685821533,848, subtitles_en_alternate,1,5,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.316105842590332,848, subtitles_en_alternate,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1400718688964844,848, subtitles_en_alternate,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1492774486541748,848, subtitles_en_alternate,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1337254047393799,848, subtitles_en_alternate,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1037378311157227,848, subtitles_en_alternate,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1312851905822754,848, subtitles_en_alternate,1,5,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8294000625610352,848,LC_ALL=C subtitles_en_alternate,1,5,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.808884620666504,848,LC_ALL=C subtitles_en_alternate,1,5,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8134734630584717,848,LC_ALL=C subtitles_en_alternate,1,5,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8405649662017822,848,LC_ALL=C subtitles_en_alternate,1,5,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8500289916992188,848,LC_ALL=C subtitles_en_alternate,1,5,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21175312995910645,848, subtitles_en_alternate,1,5,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2118232250213623,848, subtitles_en_alternate,1,5,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21287035942077637,848, subtitles_en_alternate,1,5,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21167230606079102,848, subtitles_en_alternate,1,5,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28102636337280273,848, subtitles_en_alternate,1,5,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5029187202453613,848,LC_ALL=C subtitles_en_alternate,1,5,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.49977445602417,848,LC_ALL=C subtitles_en_alternate,1,5,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.508340835571289,848,LC_ALL=C subtitles_en_alternate,1,5,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5002548694610596,848,LC_ALL=C subtitles_en_alternate,1,5,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.629526138305664,848,LC_ALL=C subtitles_en_alternate_casei,1,5,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.730497360229492,862, subtitles_en_alternate_casei,1,5,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.781018018722534,862, subtitles_en_alternate_casei,1,5,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.7858059406280518,862, subtitles_en_alternate_casei,1,5,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.7127914428710938,862, subtitles_en_alternate_casei,1,5,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.717308759689331,862, subtitles_en_alternate_casei,1,5,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.428208351135254,862, subtitles_en_alternate_casei,1,5,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.389420509338379,862, subtitles_en_alternate_casei,1,5,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.403301954269409,862, subtitles_en_alternate_casei,1,5,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.4691550731658936,862, subtitles_en_alternate_casei,1,5,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.4245004653930664,862, subtitles_en_alternate_casei,1,5,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.978189706802368,862,LC_ALL=C subtitles_en_alternate_casei,1,5,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.974303722381592,862,LC_ALL=C subtitles_en_alternate_casei,1,5,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.982886552810669,862,LC_ALL=C subtitles_en_alternate_casei,1,5,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.90018630027771,862,LC_ALL=C subtitles_en_alternate_casei,1,5,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.0078439712524414,862,LC_ALL=C subtitles_en_alternate_casei,1,5,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9129142761230469,862, subtitles_en_alternate_casei,1,5,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9066660404205322,862, subtitles_en_alternate_casei,1,5,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.946380615234375,862, subtitles_en_alternate_casei,1,5,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9672930240631104,862, subtitles_en_alternate_casei,1,5,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.028451919555664,862, subtitles_en_alternate_casei,1,5,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.9427030086517334,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,1,5,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.938739061355591,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,1,5,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.921248435974121,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,1,5,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.9194068908691406,862,LC_ALL=en_US.UTF-8 subtitles_en_alternate_casei,1,5,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.917184829711914,862,LC_ALL=en_US.UTF-8 subtitles_en_literal,1,5,rg,rg Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.12293672561645508,629, subtitles_en_literal,1,5,rg,rg Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1259000301361084,629, subtitles_en_literal,1,5,rg,rg Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.12285709381103516,629, subtitles_en_literal,1,5,rg,rg Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.12280964851379395,629, subtitles_en_literal,1,5,rg,rg Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1547396183013916,629, subtitles_en_literal,1,5,rg (no mmap),rg --no-mmap Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22011375427246094,629, subtitles_en_literal,1,5,rg (no mmap),rg --no-mmap Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23095202445983887,629, subtitles_en_literal,1,5,rg (no mmap),rg --no-mmap Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2577846050262451,629, subtitles_en_literal,1,5,rg (no mmap),rg --no-mmap Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2563819885253906,629, subtitles_en_literal,1,5,rg (no mmap),rg --no-mmap Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.24869346618652344,629, subtitles_en_literal,1,5,pt,pt -N Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.415337324142456,629, subtitles_en_literal,1,5,pt,pt -N Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.4208543300628662,629, subtitles_en_literal,1,5,pt,pt -N Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.416351079940796,629, subtitles_en_literal,1,5,pt,pt -N Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.4270708560943604,629, subtitles_en_literal,1,5,pt,pt -N Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.4243996143341064,629, subtitles_en_literal,1,5,sift,sift Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2245020866394043,629, subtitles_en_literal,1,5,sift,sift Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2382345199584961,629, subtitles_en_literal,1,5,sift,sift Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23533034324645996,629, subtitles_en_literal,1,5,sift,sift Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2577829360961914,629, subtitles_en_literal,1,5,sift,sift Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2599349021911621,629, subtitles_en_literal,1,5,grep,grep -a Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4733700752258301,629,LC_ALL=C subtitles_en_literal,1,5,grep,grep -a Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4598572254180908,629,LC_ALL=C subtitles_en_literal,1,5,grep,grep -a Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5303301811218262,629,LC_ALL=C subtitles_en_literal,1,5,grep,grep -a Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4775106906890869,629,LC_ALL=C subtitles_en_literal,1,5,grep,grep -a Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4881136417388916,629,LC_ALL=C subtitles_en_literal,1,5,rg (lines),rg -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20051789283752441,629, subtitles_en_literal,1,5,rg (lines),rg -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17326998710632324,629, subtitles_en_literal,1,5,rg (lines),rg -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20733428001403809,629, subtitles_en_literal,1,5,rg (lines),rg -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.189713716506958,629, subtitles_en_literal,1,5,rg (lines),rg -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17817258834838867,629, subtitles_en_literal,1,5,ag (lines),ag -s Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5327835083007812,629, subtitles_en_literal,1,5,ag (lines),ag -s Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5411181449890137,629, subtitles_en_literal,1,5,ag (lines),ag -s Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.600783109664917,629, subtitles_en_literal,1,5,ag (lines),ag -s Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5838911533355713,629, subtitles_en_literal,1,5,ag (lines),ag -s Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6051928997039795,629, subtitles_en_literal,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4090385437011719,629, subtitles_en_literal,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3816399574279785,629, subtitles_en_literal,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.38033008575439453,629, subtitles_en_literal,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3731727600097656,629, subtitles_en_literal,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.38796329498291016,629, subtitles_en_literal,1,5,pt (lines),pt Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.4102630615234375,629, subtitles_en_literal,1,5,pt (lines),pt Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.4137451648712158,629, subtitles_en_literal,1,5,pt (lines),pt Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.4649333953857422,629, subtitles_en_literal,1,5,pt (lines),pt Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.430387258529663,629, subtitles_en_literal,1,5,pt (lines),pt Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.541991949081421,629, subtitles_en_literal,1,5,sift (lines),sift -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.6231405735015869,629, subtitles_en_literal,1,5,sift (lines),sift -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5986526012420654,629, subtitles_en_literal,1,5,sift (lines),sift -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5821917057037354,629, subtitles_en_literal,1,5,sift (lines),sift -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.6045489311218262,629, subtitles_en_literal,1,5,sift (lines),sift -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5986905097961426,629, subtitles_en_literal,1,5,grep (lines),grep -an Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8278565406799316,629,LC_ALL=C subtitles_en_literal,1,5,grep (lines),grep -an Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.777052640914917,629,LC_ALL=C subtitles_en_literal,1,5,grep (lines),grep -an Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7619414329528809,629,LC_ALL=C subtitles_en_literal,1,5,grep (lines),grep -an Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8248744010925293,629,LC_ALL=C subtitles_en_literal,1,5,grep (lines),grep -an Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.824932336807251,629,LC_ALL=C subtitles_en_literal_casei,1,5,rg,rg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2718961238861084,642, subtitles_en_literal_casei,1,5,rg,rg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27082157135009766,642, subtitles_en_literal_casei,1,5,rg,rg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27086758613586426,642, subtitles_en_literal_casei,1,5,rg,rg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.274705171585083,642, subtitles_en_literal_casei,1,5,rg,rg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3337059020996094,642, subtitles_en_literal_casei,1,5,grep,grep -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9112112522125244,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,1,5,grep,grep -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.907888650894165,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,1,5,grep,grep -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.912668228149414,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,1,5,grep,grep -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9082865715026855,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,1,5,grep,grep -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9177796840667725,642,LC_ALL=en_US.UTF-8 subtitles_en_literal_casei,1,5,grep (ASCII),grep -E -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.6020669937133789,642,LC_ALL=C subtitles_en_literal_casei,1,5,grep (ASCII),grep -E -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.568228006362915,642,LC_ALL=C subtitles_en_literal_casei,1,5,grep (ASCII),grep -E -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5648214817047119,642,LC_ALL=C subtitles_en_literal_casei,1,5,grep (ASCII),grep -E -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5568234920501709,642,LC_ALL=C subtitles_en_literal_casei,1,5,grep (ASCII),grep -E -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5588953495025635,642,LC_ALL=C subtitles_en_literal_casei,1,5,rg (lines),rg -n -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3486766815185547,642, subtitles_en_literal_casei,1,5,rg (lines),rg -n -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.34010815620422363,642, subtitles_en_literal_casei,1,5,rg (lines),rg -n -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.33849263191223145,642, subtitles_en_literal_casei,1,5,rg (lines),rg -n -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3917088508605957,642, subtitles_en_literal_casei,1,5,rg (lines),rg -n -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.39266490936279297,642, subtitles_en_literal_casei,1,5,ag (lines) (ASCII),ag -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5564041137695312,642, subtitles_en_literal_casei,1,5,ag (lines) (ASCII),ag -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5533506870269775,642, subtitles_en_literal_casei,1,5,ag (lines) (ASCII),ag -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6205368041992188,642, subtitles_en_literal_casei,1,5,ag (lines) (ASCII),ag -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5530028343200684,642, subtitles_en_literal_casei,1,5,ag (lines) (ASCII),ag -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6189889907836914,642, subtitles_en_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3834850788116455,642, subtitles_en_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.41916346549987793,642, subtitles_en_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3895289897918701,642, subtitles_en_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4278140068054199,642, subtitles_en_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4013493061065674,642, subtitles_en_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17953085899353027,629, subtitles_en_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17679834365844727,629, subtitles_en_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17448186874389648,629, subtitles_en_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21117281913757324,629, subtitles_en_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1848156452178955,629, subtitles_en_literal_word,1,5,ag (ASCII),ag -sw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5236153602600098,629, subtitles_en_literal_word,1,5,ag (ASCII),ag -sw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.52512526512146,629, subtitles_en_literal_word,1,5,ag (ASCII),ag -sw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5218794345855713,629, subtitles_en_literal_word,1,5,ag (ASCII),ag -sw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5384306907653809,629, subtitles_en_literal_word,1,5,ag (ASCII),ag -sw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5150353908538818,629, subtitles_en_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3757903575897217,629, subtitles_en_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3744041919708252,629, subtitles_en_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.37261366844177246,629, subtitles_en_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.40795230865478516,629, subtitles_en_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3868849277496338,629, subtitles_en_literal_word,1,5,grep (ASCII),grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8265349864959717,629,LC_ALL=C subtitles_en_literal_word,1,5,grep (ASCII),grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8123743534088135,629,LC_ALL=C subtitles_en_literal_word,1,5,grep (ASCII),grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7669925689697266,629,LC_ALL=C subtitles_en_literal_word,1,5,grep (ASCII),grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.766636848449707,629,LC_ALL=C subtitles_en_literal_word,1,5,grep (ASCII),grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7665839195251465,629,LC_ALL=C subtitles_en_literal_word,1,5,rg,rg -nw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1879115104675293,629, subtitles_en_literal_word,1,5,rg,rg -nw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18082356452941895,629, subtitles_en_literal_word,1,5,rg,rg -nw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18497347831726074,629, subtitles_en_literal_word,1,5,rg,rg -nw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1769394874572754,629, subtitles_en_literal_word,1,5,rg,rg -nw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1917715072631836,629, subtitles_en_literal_word,1,5,grep,grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8192996978759766,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,1,5,grep,grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8193323612213135,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,1,5,grep,grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7837738990783691,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,1,5,grep,grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7639024257659912,629,LC_ALL=en_US.UTF-8 subtitles_en_literal_word,1,5,grep,grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7634689807891846,629,LC_ALL=en_US.UTF-8 subtitles_en_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7922985553741455,13, subtitles_en_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7885758876800537,13, subtitles_en_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.802325963973999,13, subtitles_en_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.792595386505127,13, subtitles_en_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7909605503082275,13, subtitles_en_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5903098583221436,13, subtitles_en_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5982813835144043,13, subtitles_en_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5926671028137207,13, subtitles_en_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5976767539978027,13, subtitles_en_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.593153953552246,13, subtitles_en_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,6.614634275436401,48, subtitles_en_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,6.574857473373413,48, subtitles_en_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,6.54079270362854,48, subtitles_en_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,6.600660800933838,48, subtitles_en_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,6.531627178192139,48, subtitles_en_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,5.361133337020874,13, subtitles_en_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,5.456786870956421,13, subtitles_en_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,5.403071403503418,13, subtitles_en_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,5.398236274719238,13, subtitles_en_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,5.348573923110962,13, subtitles_en_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.5057969093322754,13,LC_ALL=C subtitles_en_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.4157862663269043,13,LC_ALL=C subtitles_en_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.471182346343994,13,LC_ALL=C subtitles_en_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.4590909481048584,13,LC_ALL=C subtitles_en_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.3759689331054688,13,LC_ALL=C subtitles_en_surrounding_words,1,5,rg,rg -n \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18518710136413574,317, subtitles_en_surrounding_words,1,5,rg,rg -n \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18791556358337402,317, subtitles_en_surrounding_words,1,5,rg,rg -n \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18598675727844238,317, subtitles_en_surrounding_words,1,5,rg,rg -n \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18552684783935547,317, subtitles_en_surrounding_words,1,5,rg,rg -n \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19262075424194336,317, subtitles_en_surrounding_words,1,5,grep,grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1321008205413818,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,1,5,grep,grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0709969997406006,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,1,5,grep,grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1117346286773682,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,1,5,grep,grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0880234241485596,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,1,5,grep,grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0745558738708496,317,LC_ALL=en_US.UTF-8 subtitles_en_surrounding_words,1,5,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1827528476715088,317, subtitles_en_surrounding_words,1,5,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18874144554138184,317, subtitles_en_surrounding_words,1,5,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17983436584472656,317, subtitles_en_surrounding_words,1,5,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18831133842468262,317, subtitles_en_surrounding_words,1,5,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17810606956481934,317, subtitles_en_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.5957207679748535,323, subtitles_en_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.627211570739746,323, subtitles_en_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.554431200027466,323, subtitles_en_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.492656469345093,323, subtitles_en_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.443558216094971,323, subtitles_en_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.522758722305298,317, subtitles_en_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.502918004989624,317, subtitles_en_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.6503307819366455,317, subtitles_en_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.58940052986145,317, subtitles_en_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.569624423980713,317, subtitles_en_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0672054290771484,317,LC_ALL=C subtitles_en_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0729331970214844,317,LC_ALL=C subtitles_en_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.052501916885376,317,LC_ALL=C subtitles_en_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0711696147918701,317,LC_ALL=C subtitles_en_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0863316059112549,317,LC_ALL=C subtitles_ru_alternate,1,5,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0312588214874268,691, subtitles_ru_alternate,1,5,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.063939094543457,691, subtitles_ru_alternate,1,5,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0000121593475342,691, subtitles_ru_alternate,1,5,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9842438697814941,691, subtitles_ru_alternate,1,5,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.95733642578125,691, subtitles_ru_alternate,1,5,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7781903743743896,691, subtitles_ru_alternate,1,5,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.861164093017578,691, subtitles_ru_alternate,1,5,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.8268885612487793,691, subtitles_ru_alternate,1,5,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.8621268272399902,691, subtitles_ru_alternate,1,5,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.8216166496276855,691, subtitles_ru_alternate,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0069098472595215,691, subtitles_ru_alternate,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.025178909301758,691, subtitles_ru_alternate,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0631070137023926,691, subtitles_ru_alternate,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0902633666992188,691, subtitles_ru_alternate,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0272655487060547,691, subtitles_ru_alternate,1,5,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.510146617889404,691,LC_ALL=C subtitles_ru_alternate,1,5,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.541701793670654,691,LC_ALL=C subtitles_ru_alternate,1,5,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.506088733673096,691,LC_ALL=C subtitles_ru_alternate,1,5,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.51838755607605,691,LC_ALL=C subtitles_ru_alternate,1,5,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.486810684204102,691,LC_ALL=C subtitles_ru_alternate,1,5,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9679937362670898,691, subtitles_ru_alternate,1,5,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9942011833190918,691, subtitles_ru_alternate,1,5,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9233448505401611,691, subtitles_ru_alternate,1,5,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9294781684875488,691, subtitles_ru_alternate,1,5,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.8729774951934814,691, subtitles_ru_alternate,1,5,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.100147485733032,691,LC_ALL=C subtitles_ru_alternate,1,5,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.075790166854858,691,LC_ALL=C subtitles_ru_alternate,1,5,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.069685220718384,691,LC_ALL=C subtitles_ru_alternate,1,5,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.0526063442230225,691,LC_ALL=C subtitles_ru_alternate,1,5,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.129194498062134,691,LC_ALL=C subtitles_ru_alternate_casei,1,5,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7894201278686523,691, subtitles_ru_alternate_casei,1,5,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7878782749176025,691, subtitles_ru_alternate_casei,1,5,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.796328544616699,691, subtitles_ru_alternate_casei,1,5,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.8249149322509766,691, subtitles_ru_alternate_casei,1,5,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7949724197387695,691, subtitles_ru_alternate_casei,1,5,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.075739622116089,691, subtitles_ru_alternate_casei,1,5,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.013590097427368,691, subtitles_ru_alternate_casei,1,5,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.012375593185425,691, subtitles_ru_alternate_casei,1,5,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.023118495941162,691, subtitles_ru_alternate_casei,1,5,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0641982555389404,691, subtitles_ru_alternate_casei,1,5,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.467320442199707,691,LC_ALL=C subtitles_ru_alternate_casei,1,5,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.486851692199707,691,LC_ALL=C subtitles_ru_alternate_casei,1,5,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.479818344116211,691,LC_ALL=C subtitles_ru_alternate_casei,1,5,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.516186475753784,691,LC_ALL=C subtitles_ru_alternate_casei,1,5,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.471773862838745,691,LC_ALL=C subtitles_ru_alternate_casei,1,5,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,11.026185274124146,735, subtitles_ru_alternate_casei,1,5,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,11.168465614318848,735, subtitles_ru_alternate_casei,1,5,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,11.039950370788574,735, subtitles_ru_alternate_casei,1,5,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,11.089850425720215,735, subtitles_ru_alternate_casei,1,5,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,11.112446546554565,735, subtitles_ru_alternate_casei,1,5,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.822641849517822,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,1,5,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.808355331420898,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,1,5,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.80171275138855,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,1,5,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.794351577758789,735,LC_ALL=en_US.UTF-8 subtitles_ru_alternate_casei,1,5,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.844403266906738,735,LC_ALL=en_US.UTF-8 subtitles_ru_literal,1,5,rg,rg Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.20681476593017578,583, subtitles_ru_literal,1,5,rg,rg Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.190568208694458,583, subtitles_ru_literal,1,5,rg,rg Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.18462657928466797,583, subtitles_ru_literal,1,5,rg,rg Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.1873643398284912,583, subtitles_ru_literal,1,5,rg,rg Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.20382428169250488,583, subtitles_ru_literal,1,5,rg (no mmap),rg --no-mmap Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3085510730743408,583, subtitles_ru_literal,1,5,rg (no mmap),rg --no-mmap Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.318758487701416,583, subtitles_ru_literal,1,5,rg (no mmap),rg --no-mmap Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3177149295806885,583, subtitles_ru_literal,1,5,rg (no mmap),rg --no-mmap Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.31236958503723145,583, subtitles_ru_literal,1,5,rg (no mmap),rg --no-mmap Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.31880998611450195,583, subtitles_ru_literal,1,5,pt,pt -N Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.152938365936279,583, subtitles_ru_literal,1,5,pt,pt -N Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.124867677688599,583, subtitles_ru_literal,1,5,pt,pt -N Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.132290363311768,583, subtitles_ru_literal,1,5,pt,pt -N Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.158328056335449,583, subtitles_ru_literal,1,5,pt,pt -N Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.1022467613220215,583, subtitles_ru_literal,1,5,sift,sift Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.807113409042358,583, subtitles_ru_literal,1,5,sift,sift Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.8178558349609375,583, subtitles_ru_literal,1,5,sift,sift Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.925220012664795,583, subtitles_ru_literal,1,5,sift,sift Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.861236333847046,583, subtitles_ru_literal,1,5,sift,sift Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.763278484344482,583, subtitles_ru_literal,1,5,grep,grep -a Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.704503059387207,583,LC_ALL=C subtitles_ru_literal,1,5,grep,grep -a Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6887199878692627,583,LC_ALL=C subtitles_ru_literal,1,5,grep,grep -a Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7092702388763428,583,LC_ALL=C subtitles_ru_literal,1,5,grep,grep -a Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6964359283447266,583,LC_ALL=C subtitles_ru_literal,1,5,grep,grep -a Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6928379535675049,583,LC_ALL=C subtitles_ru_literal,1,5,rg (lines),rg -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2646975517272949,583, subtitles_ru_literal,1,5,rg (lines),rg -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.26806163787841797,583, subtitles_ru_literal,1,5,rg (lines),rg -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2700214385986328,583, subtitles_ru_literal,1,5,rg (lines),rg -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2669072151184082,583, subtitles_ru_literal,1,5,rg (lines),rg -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2656106948852539,583, subtitles_ru_literal,1,5,ag (lines),ag -s Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.9972407817840576,583, subtitles_ru_literal,1,5,ag (lines),ag -s Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.906053066253662,583, subtitles_ru_literal,1,5,ag (lines),ag -s Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.864766836166382,583, subtitles_ru_literal,1,5,ag (lines),ag -s Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.7820546627044678,583, subtitles_ru_literal,1,5,ag (lines),ag -s Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.7599871158599854,583, subtitles_ru_literal,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.411653995513916,583, subtitles_ru_literal,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.394604206085205,583, subtitles_ru_literal,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.362853765487671,583, subtitles_ru_literal,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.4795477390289307,583, subtitles_ru_literal,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.4428844451904297,583, subtitles_ru_literal,1,5,pt (lines),pt Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.122563123703003,583, subtitles_ru_literal,1,5,pt (lines),pt Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.17008900642395,583, subtitles_ru_literal,1,5,pt (lines),pt Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.1965367794036865,583, subtitles_ru_literal,1,5,pt (lines),pt Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.152370929718018,583, subtitles_ru_literal,1,5,pt (lines),pt Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.106513738632202,583, subtitles_ru_literal,1,5,sift (lines),sift -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.408761978149414,583, subtitles_ru_literal,1,5,sift (lines),sift -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.423579454421997,583, subtitles_ru_literal,1,5,sift (lines),sift -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.2807464599609375,583, subtitles_ru_literal,1,5,sift (lines),sift -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.3771467208862305,583, subtitles_ru_literal,1,5,sift (lines),sift -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.378506422042847,583, subtitles_ru_literal,1,5,grep (lines),grep -an Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.121800422668457,583,LC_ALL=C subtitles_ru_literal,1,5,grep (lines),grep -an Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1189923286437988,583,LC_ALL=C subtitles_ru_literal,1,5,grep (lines),grep -an Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0678138732910156,583,LC_ALL=C subtitles_ru_literal,1,5,grep (lines),grep -an Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0668041706085205,583,LC_ALL=C subtitles_ru_literal,1,5,grep (lines),grep -an Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0713574886322021,583,LC_ALL=C subtitles_ru_literal_casei,1,5,rg,rg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9427816867828369,604, subtitles_ru_literal_casei,1,5,rg,rg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0397350788116455,604, subtitles_ru_literal_casei,1,5,rg,rg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9732518196105957,604, subtitles_ru_literal_casei,1,5,rg,rg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9387776851654053,604, subtitles_ru_literal_casei,1,5,rg,rg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9536802768707275,604, subtitles_ru_literal_casei,1,5,grep,grep -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.338641405105591,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,1,5,grep,grep -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.280565023422241,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,1,5,grep,grep -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.241750240325928,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,1,5,grep,grep -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.316105604171753,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,1,5,grep,grep -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.307560205459595,604,LC_ALL=en_US.UTF-8 subtitles_ru_literal_casei,1,5,grep (ASCII),grep -E -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7379302978515625,583,LC_ALL=C subtitles_ru_literal_casei,1,5,grep (ASCII),grep -E -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7226619720458984,583,LC_ALL=C subtitles_ru_literal_casei,1,5,grep (ASCII),grep -E -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.683293342590332,583,LC_ALL=C subtitles_ru_literal_casei,1,5,grep (ASCII),grep -E -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.714146614074707,583,LC_ALL=C subtitles_ru_literal_casei,1,5,grep (ASCII),grep -E -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7654330730438232,583,LC_ALL=C subtitles_ru_literal_casei,1,5,rg (lines),rg -n -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0237820148468018,604, subtitles_ru_literal_casei,1,5,rg (lines),rg -n -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0194151401519775,604, subtitles_ru_literal_casei,1,5,rg (lines),rg -n -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0364336967468262,604, subtitles_ru_literal_casei,1,5,rg (lines),rg -n -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.035005807876587,604, subtitles_ru_literal_casei,1,5,rg (lines),rg -n -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0438766479492188,604, subtitles_ru_literal_casei,1,5,ag (lines) (ASCII),ag -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.619025468826294,, subtitles_ru_literal_casei,1,5,ag (lines) (ASCII),ag -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.647244930267334,, subtitles_ru_literal_casei,1,5,ag (lines) (ASCII),ag -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6785612106323242,, subtitles_ru_literal_casei,1,5,ag (lines) (ASCII),ag -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6503715515136719,, subtitles_ru_literal_casei,1,5,ag (lines) (ASCII),ag -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6314499378204346,, subtitles_ru_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.8302316665649414,583, subtitles_ru_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7719593048095703,583, subtitles_ru_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7697594165802002,583, subtitles_ru_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7312629222869873,583, subtitles_ru_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.767866849899292,583, subtitles_ru_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.19411826133728027,, subtitles_ru_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.18651676177978516,, subtitles_ru_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.19614577293395996,, subtitles_ru_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.18459081649780273,, subtitles_ru_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.1797487735748291,, subtitles_ru_literal_word,1,5,ag (ASCII),ag -sw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6507105827331543,, subtitles_ru_literal_word,1,5,ag (ASCII),ag -sw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6480035781860352,, subtitles_ru_literal_word,1,5,ag (ASCII),ag -sw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7138750553131104,, subtitles_ru_literal_word,1,5,ag (ASCII),ag -sw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6521759033203125,, subtitles_ru_literal_word,1,5,ag (ASCII),ag -sw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6728894710540771,, subtitles_ru_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.3646819591522217,583, subtitles_ru_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.3836848735809326,583, subtitles_ru_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.419490337371826,583, subtitles_ru_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.363335609436035,583, subtitles_ru_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.488351345062256,583, subtitles_ru_literal_word,1,5,grep (ASCII),grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.171506643295288,583,LC_ALL=C subtitles_ru_literal_word,1,5,grep (ASCII),grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1602776050567627,583,LC_ALL=C subtitles_ru_literal_word,1,5,grep (ASCII),grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.084787368774414,583,LC_ALL=C subtitles_ru_literal_word,1,5,grep (ASCII),grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0714166164398193,583,LC_ALL=C subtitles_ru_literal_word,1,5,grep (ASCII),grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.083632469177246,583,LC_ALL=C subtitles_ru_literal_word,1,5,rg,rg -nw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2769143581390381,579, subtitles_ru_literal_word,1,5,rg,rg -nw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2694058418273926,579, subtitles_ru_literal_word,1,5,rg,rg -nw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.26763367652893066,579, subtitles_ru_literal_word,1,5,rg,rg -nw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2671318054199219,579, subtitles_ru_literal_word,1,5,rg,rg -nw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2922348976135254,579, subtitles_ru_literal_word,1,5,grep,grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.083528757095337,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,1,5,grep,grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0857081413269043,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,1,5,grep,grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.07025146484375,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,1,5,grep,grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.071930170059204,579,LC_ALL=en_US.UTF-8 subtitles_ru_literal_word,1,5,grep,grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0709245204925537,579,LC_ALL=en_US.UTF-8 subtitles_ru_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1552906036376953,41, subtitles_ru_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.164951801300049,41, subtitles_ru_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.175389289855957,41, subtitles_ru_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1861774921417236,41, subtitles_ru_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.153625011444092,41, subtitles_ru_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.7353317737579346,, subtitles_ru_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.7592883110046387,, subtitles_ru_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.7242491245269775,, subtitles_ru_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.747089385986328,, subtitles_ru_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.732586145401001,, subtitles_ru_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0796375274658203,, subtitles_ru_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9670393466949463,, subtitles_ru_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9413447380065918,, subtitles_ru_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.916764497756958,, subtitles_ru_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9110031127929688,, subtitles_ru_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0622072219848633,, subtitles_ru_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0975682735443115,, subtitles_ru_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0741493701934814,, subtitles_ru_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0423810482025146,, subtitles_ru_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.000764846801758,, subtitles_ru_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.6251120567321777,,LC_ALL=C subtitles_ru_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.644089698791504,,LC_ALL=C subtitles_ru_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.6416165828704834,,LC_ALL=C subtitles_ru_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.6321892738342285,,LC_ALL=C subtitles_ru_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.6264762878417969,,LC_ALL=C subtitles_ru_surrounding_words,1,5,rg,rg -n \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.29879307746887207,278, subtitles_ru_surrounding_words,1,5,rg,rg -n \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3226010799407959,278, subtitles_ru_surrounding_words,1,5,rg,rg -n \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.32187771797180176,278, subtitles_ru_surrounding_words,1,5,rg,rg -n \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2825047969818115,278, subtitles_ru_surrounding_words,1,5,rg,rg -n \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.283217191696167,278, subtitles_ru_surrounding_words,1,5,grep,grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3977878093719482,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,1,5,grep,grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.4288139343261719,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,1,5,grep,grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.4054889678955078,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,1,5,grep,grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.4003441333770752,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,1,5,grep,grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.5269148349761963,278,LC_ALL=en_US.UTF-8 subtitles_ru_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.8912529945373535,, subtitles_ru_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9221522808074951,, subtitles_ru_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9416618347167969,, subtitles_ru_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.893650770187378,, subtitles_ru_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.8895554542541504,, subtitles_ru_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0110745429992676,, subtitles_ru_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9790067672729492,, subtitles_ru_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0426392555236816,, subtitles_ru_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.121723175048828,, subtitles_ru_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.1247596740722656,, subtitles_ru_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3579976558685303,,LC_ALL=C subtitles_ru_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.382859468460083,,LC_ALL=C subtitles_ru_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.393401861190796,,LC_ALL=C subtitles_ru_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.474374532699585,,LC_ALL=C subtitles_ru_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3835601806640625,,LC_ALL=C ripgrep-11.0.2/benchsuite/runs/2018-01-08-archlinux-cheetah/summary010064400017500000144000000252571351372666500227000ustar0000000000000000linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------- rg (ignore) 0.100 +/- 0.003 (lines: 68) ag (ignore) 0.501 +/- 0.033 (lines: 68) git grep (ignore) 0.267 +/- 0.004 (lines: 68) rg (whitelist)* 0.090 +/- 0.001 (lines: 68)* ucg (whitelist) 0.135 +/- 0.003 (lines: 68) linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT) ------------------------------------------------------------------------------- rg (ignore) 0.124 +/- 0.004 (lines: 160) ag (ignore) 0.564 +/- 0.041 (lines: 160) git grep (ignore) 0.928 +/- 0.033 (lines: 160) rg (whitelist)* 0.096 +/- 0.003 (lines: 160)* ucg (whitelist) 0.248 +/- 0.008 (lines: 160) linux_literal (pattern: PM_RESUME) ---------------------------------- rg (ignore)* 0.082 +/- 0.001 (lines: 16)* rg (ignore) (mmap) 0.751 +/- 0.062 (lines: 16) ag (ignore) (mmap) 0.612 +/- 0.065 (lines: 16) pt (ignore) 0.195 +/- 0.020 (lines: 16) sift (ignore) 0.468 +/- 0.006 (lines: 16) git grep (ignore) 0.196 +/- 0.005 (lines: 16) rg (whitelist) 0.085 +/- 0.003 (lines: 16) ucg (whitelist) 0.159 +/- 0.002 (lines: 16) linux_literal_casei (pattern: PM_RESUME) ---------------------------------------- rg (ignore) 0.105 +/- 0.003 (lines: 374) rg (ignore) (mmap) 0.799 +/- 0.012 (lines: 374) ag (ignore) (mmap) 0.469 +/- 0.030 (lines: 374) pt (ignore) 14.177 +/- 0.049 (lines: 374) sift (ignore) 0.460 +/- 0.006 (lines: 374) git grep (ignore) 0.198 +/- 0.006 (lines: 370) rg (whitelist)* 0.097 +/- 0.003 (lines: 370)* ucg (whitelist) 0.154 +/- 0.003 (lines: 370) linux_literal_default (pattern: PM_RESUME) ------------------------------------------ rg* 0.089 +/- 0.002 (lines: 16)* ag 0.469 +/- 0.038 (lines: 16) ucg 0.154 +/- 0.001 (lines: 16) pt 0.237 +/- 0.040 (lines: 16) sift 0.126 +/- 0.003 (lines: 16) git grep 0.175 +/- 0.013 (lines: 16) linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ----------------------------------------------------------------- rg (ignore) 0.329 +/- 0.006 (lines: 490) rg (ignore) (ASCII) 0.172 +/- 0.002 (lines: 490) ag (ignore) (ASCII) 0.725 +/- 0.067 (lines: 766) pt (ignore) (ASCII) 12.478 +/- 0.097 (lines: 490) sift (ignore) (ASCII) 9.002 +/- 0.096 (lines: 490) git grep (ignore) 8.542 +/- 0.277 (lines: 490) git grep (ignore) (ASCII) 1.883 +/- 0.087 (lines: 490) rg (whitelist) 0.289 +/- 0.006 (lines: 458) rg (whitelist) (ASCII)* 0.160 +/- 0.001 (lines: 458)* ucg (whitelist) (ASCII) 0.474 +/- 0.020 (lines: 416) linux_re_literal_suffix (pattern: [A-Z]+_RESUME) ------------------------------------------------ rg (ignore) 0.084 +/- 0.002 (lines: 1652) ag (ignore) 0.483 +/- 0.006 (lines: 1652) pt (ignore) 14.128 +/- 0.026 (lines: 1652) sift (ignore) 4.099 +/- 0.103 (lines: 1652) git grep (ignore) 0.529 +/- 0.014 (lines: 1652) rg (whitelist)* 0.078 +/- 0.002 (lines: 1630)* ucg (whitelist) 0.135 +/- 0.002 (lines: 1630) linux_unicode_greek (pattern: \p{Greek}) ---------------------------------------- rg* 0.172 +/- 0.002 (lines: 23)* pt 14.122 +/- 0.031 (lines: 23) sift 2.826 +/- 0.012 (lines: 23) linux_unicode_greek_casei (pattern: \p{Greek}) ---------------------------------------------- rg 0.170 +/- 0.001 (lines: 103) pt 14.120 +/- 0.039 (lines: 23) sift* 0.004 +/- 0.000 (lines: 0)* linux_unicode_word (pattern: \wAh) ---------------------------------- rg (ignore) 0.098 +/- 0.002 (lines: 186) rg (ignore) (ASCII) 0.096 +/- 0.002 (lines: 174) ag (ignore) (ASCII) 0.627 +/- 0.038 (lines: 174) pt (ignore) (ASCII) 14.182 +/- 0.024 (lines: 174) sift (ignore) (ASCII) 4.135 +/- 0.119 (lines: 174) git grep (ignore) 4.854 +/- 0.643 (lines: 186) git grep (ignore) (ASCII) 1.376 +/- 0.035 (lines: 174) rg (whitelist) 0.081 +/- 0.001 (lines: 180)* rg (whitelist) (ASCII)* 0.082 +/- 0.002 (lines: 168) ucg (ASCII) 0.155 +/- 0.003 (lines: 168) linux_word (pattern: PM_RESUME) ------------------------------- rg (ignore) 0.091 +/- 0.002 (lines: 6) ag (ignore) 0.461 +/- 0.020 (lines: 6) pt (ignore) 14.223 +/- 0.038 (lines: 6) sift (ignore) 3.226 +/- 0.043 (lines: 6) git grep (ignore) 0.173 +/- 0.006 (lines: 6) rg (whitelist)* 0.076 +/- 0.001 (lines: 6)* ucg (whitelist) 0.156 +/- 0.003 (lines: 6) subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------- rg (lines) 0.311 +/- 0.026 (lines: 848) ag (lines) 2.242 +/- 0.086 (lines: 848) ucg (lines) 1.132 +/- 0.017 (lines: 848) grep (lines) 1.828 +/- 0.017 (lines: 848) rg* 0.226 +/- 0.031 (lines: 848)* grep 1.528 +/- 0.057 (lines: 848) subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty) --------------------------------------------------------------------------------------------------------------------- ag (ASCII) 3.745 +/- 0.035 (lines: 862) ucg (ASCII) 2.423 +/- 0.030 (lines: 862) grep (ASCII) 2.969 +/- 0.040 (lines: 862) rg* 1.952 +/- 0.049 (lines: 862)* grep 2.928 +/- 0.012 (lines: 862) subtitles_en_literal (pattern: Sherlock Holmes) ----------------------------------------------- rg* 0.130 +/- 0.014 (lines: 629)* rg (no mmap) 0.243 +/- 0.017 (lines: 629) pt 1.421 +/- 0.005 (lines: 629) sift 0.243 +/- 0.015 (lines: 629) grep 0.486 +/- 0.027 (lines: 629) rg (lines) 0.190 +/- 0.014 (lines: 629) ag (lines) 1.573 +/- 0.034 (lines: 629) ucg (lines) 0.386 +/- 0.014 (lines: 629) pt (lines) 1.452 +/- 0.055 (lines: 629) sift (lines) 0.601 +/- 0.015 (lines: 629) grep (lines) 0.803 +/- 0.031 (lines: 629) subtitles_en_literal_casei (pattern: Sherlock Holmes) ----------------------------------------------------- rg* 0.284 +/- 0.028 (lines: 642)* grep 1.912 +/- 0.004 (lines: 642) grep (ASCII) 0.570 +/- 0.018 (lines: 642) rg (lines) 0.362 +/- 0.028 (lines: 642) ag (lines) (ASCII) 1.580 +/- 0.036 (lines: 642) ucg (lines) (ASCII) 0.404 +/- 0.019 (lines: 642) subtitles_en_literal_word (pattern: Sherlock Holmes) ---------------------------------------------------- rg (ASCII)* 0.185 +/- 0.015 (lines: 629) ag (ASCII) 1.525 +/- 0.009 (lines: 629) ucg (ASCII) 0.384 +/- 0.015 (lines: 629) grep (ASCII) 0.788 +/- 0.029 (lines: 629) rg 0.184 +/- 0.006 (lines: 629)* grep 0.790 +/- 0.028 (lines: 629) subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 1.793 +/- 0.005 (lines: 13) rg (ASCII)* 1.594 +/- 0.003 (lines: 13)* ag (ASCII) 6.573 +/- 0.036 (lines: 48) ucg (ASCII) 5.394 +/- 0.042 (lines: 13) grep (ASCII) 3.446 +/- 0.050 (lines: 13) subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+) ------------------------------------------------------------ rg 0.187 +/- 0.003 (lines: 317) grep 1.095 +/- 0.026 (lines: 317) rg (ASCII)* 0.184 +/- 0.005 (lines: 317)* ag (ASCII) 4.543 +/- 0.075 (lines: 323) ucg (ASCII) 3.567 +/- 0.058 (lines: 317) grep (ASCII) 1.070 +/- 0.012 (lines: 317) subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------- rg (lines) 1.007 +/- 0.041 (lines: 691) ag (lines) 3.830 +/- 0.035 (lines: 691) ucg (lines) 2.043 +/- 0.034 (lines: 691) grep (lines) 7.513 +/- 0.020 (lines: 691) rg* 0.938 +/- 0.046 (lines: 691)* grep 7.085 +/- 0.030 (lines: 691) subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти) ----------------------------------------------------------------------------------------------------------------- ag (ASCII) 3.799 +/- 0.015 (lines: 691) ucg (ASCII)* 2.038 +/- 0.030 (lines: 691)* grep (ASCII) 7.484 +/- 0.019 (lines: 691) rg 11.087 +/- 0.057 (lines: 735) grep 6.814 +/- 0.020 (lines: 735) subtitles_ru_literal (pattern: Шерлок Холмс) -------------------------------------------- rg* 0.195 +/- 0.010 (lines: 583)* rg (no mmap) 0.315 +/- 0.005 (lines: 583) pt 5.134 +/- 0.023 (lines: 583) sift 5.835 +/- 0.061 (lines: 583) grep 0.698 +/- 0.008 (lines: 583) rg (lines) 0.267 +/- 0.002 (lines: 583) ag (lines) 2.862 +/- 0.096 (lines: 583) ucg (lines) 2.418 +/- 0.045 (lines: 583) pt (lines) 5.150 +/- 0.036 (lines: 583) sift (lines) 6.374 +/- 0.056 (lines: 583) grep (lines) 1.089 +/- 0.028 (lines: 583) subtitles_ru_literal_casei (pattern: Шерлок Холмс) -------------------------------------------------- rg 0.970 +/- 0.041 (lines: 604) grep 6.297 +/- 0.037 (lines: 604) grep (ASCII) 0.725 +/- 0.030 (lines: 583) rg (lines) 1.032 +/- 0.010 (lines: 604) ag (lines) (ASCII)* 0.645 +/- 0.022 (lines: 0)* ucg (lines) (ASCII) 0.774 +/- 0.036 (lines: 583) subtitles_ru_literal_word (pattern: Шерлок Холмс) ------------------------------------------------- rg (ASCII)* 0.188 +/- 0.007 (lines: 0)* ag (ASCII) 0.668 +/- 0.028 (lines: 0) ucg (ASCII) 2.404 +/- 0.052 (lines: 583) grep (ASCII) 1.114 +/- 0.048 (lines: 583) rg 0.275 +/- 0.011 (lines: 579) grep 1.076 +/- 0.008 (lines: 579) subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}) ---------------------------------------------------------------------------------------- rg 3.167 +/- 0.014 (lines: 41) rg (ASCII) 2.740 +/- 0.014 (lines: 0) ag (ASCII) 1.963 +/- 0.069 (lines: 0) ucg (ASCII) 2.055 +/- 0.037 (lines: 0) grep (ASCII)* 1.634 +/- 0.009 (lines: 0)* subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+) ----------------------------------------------------------- rg* 0.302 +/- 0.020 (lines: 278)* grep 1.432 +/- 0.055 (lines: 278) ag (ASCII) 1.908 +/- 0.023 (lines: 0) ucg (ASCII) 2.056 +/- 0.066 (lines: 0) grep (ASCII) 1.398 +/- 0.044 (lines: 0) ripgrep-11.0.2/build.rs010064400017500000144000000135771352064771400131530ustar0000000000000000use std::env; use std::fs::{self, File}; use std::io::{self, Read, Write}; use std::path::Path; use std::process; use clap::Shell; use app::{RGArg, RGArgKind}; #[allow(dead_code)] #[path = "src/app.rs"] mod app; fn main() { // OUT_DIR is set by Cargo and it's where any additional build artifacts // are written. let outdir = match env::var_os("OUT_DIR") { Some(outdir) => outdir, None => { eprintln!( "OUT_DIR environment variable not defined. \ Please file a bug: \ https://github.com/BurntSushi/ripgrep/issues/new"); process::exit(1); } }; fs::create_dir_all(&outdir).unwrap(); let stamp_path = Path::new(&outdir).join("ripgrep-stamp"); if let Err(err) = File::create(&stamp_path) { panic!("failed to write {}: {}", stamp_path.display(), err); } if let Err(err) = generate_man_page(&outdir) { eprintln!("failed to generate man page: {}", err); } // Use clap to build completion files. let mut app = app::app(); app.gen_completions("rg", Shell::Bash, &outdir); app.gen_completions("rg", Shell::Fish, &outdir); app.gen_completions("rg", Shell::PowerShell, &outdir); // Note that we do not use clap's support for zsh. Instead, zsh completions // are manually maintained in `complete/_rg`. // Make the current git hash available to the build. if let Some(rev) = git_revision_hash() { println!("cargo:rustc-env=RIPGREP_BUILD_GIT_HASH={}", rev); } } fn git_revision_hash() -> Option { let result = process::Command::new("git") .args(&["rev-parse", "--short=10", "HEAD"]) .output(); result.ok().and_then(|output| { let v = String::from_utf8_lossy(&output.stdout).trim().to_string(); if v.is_empty() { None } else { Some(v) } }) } fn generate_man_page>(outdir: P) -> io::Result<()> { // If asciidoc isn't installed, then don't do anything. if let Err(err) = process::Command::new("a2x").output() { eprintln!("Could not run 'a2x' binary, skipping man page generation."); eprintln!("Error from running 'a2x': {}", err); return Ok(()); } // 1. Read asciidoc template. // 2. Interpolate template with auto-generated docs. // 3. Save interpolation to disk. // 4. Use a2x (part of asciidoc) to convert to man page. let outdir = outdir.as_ref(); let cwd = env::current_dir()?; let tpl_path = cwd.join("doc").join("rg.1.txt.tpl"); let txt_path = outdir.join("rg.1.txt"); let mut tpl = String::new(); File::open(&tpl_path)?.read_to_string(&mut tpl)?; tpl = tpl.replace("{OPTIONS}", &formatted_options()?); let githash = git_revision_hash(); let githash = githash.as_ref().map(|x| &**x); tpl = tpl.replace("{VERSION}", &app::long_version(githash)); File::create(&txt_path)?.write_all(tpl.as_bytes())?; let result = process::Command::new("a2x") .arg("--no-xmllint") .arg("--doctype").arg("manpage") .arg("--format").arg("manpage") .arg(&txt_path) .spawn()? .wait()?; if !result.success() { let msg = format!("'a2x' failed with exit code {:?}", result.code()); return Err(ioerr(msg)); } Ok(()) } fn formatted_options() -> io::Result { let mut args = app::all_args_and_flags(); args.sort_by(|x1, x2| x1.name.cmp(&x2.name)); let mut formatted = vec![]; for arg in args { if arg.hidden { continue; } // ripgrep only has two positional arguments, and probably will only // ever have two positional arguments, so we just hardcode them into // the template. if let app::RGArgKind::Positional{..} = arg.kind { continue; } formatted.push(formatted_arg(&arg)?); } Ok(formatted.join("\n\n")) } fn formatted_arg(arg: &RGArg) -> io::Result { match arg.kind { RGArgKind::Positional{..} => panic!("unexpected positional argument"), RGArgKind::Switch { long, short, multiple } => { let mut out = vec![]; let mut header = format!("--{}", long); if let Some(short) = short { header = format!("-{}, {}", short, header); } if multiple { header = format!("*{}* ...::", header); } else { header = format!("*{}*::", header); } writeln!(out, "{}", header)?; writeln!(out, "{}", formatted_doc_txt(arg)?)?; Ok(String::from_utf8(out).unwrap()) } RGArgKind::Flag { long, short, value_name, multiple, .. } => { let mut out = vec![]; let mut header = format!("--{}", long); if let Some(short) = short { header = format!("-{}, {}", short, header); } if multiple { header = format!("*{}* _{}_ ...::", header, value_name); } else { header = format!("*{}* _{}_::", header, value_name); } writeln!(out, "{}", header)?; writeln!(out, "{}", formatted_doc_txt(arg)?)?; Ok(String::from_utf8(out).unwrap()) } } } fn formatted_doc_txt(arg: &RGArg) -> io::Result { let paragraphs: Vec = arg.doc_long .replace("{", "{") .replace("}", r"}") .split("\n\n") .map(|s| s.to_string()) .collect(); if paragraphs.is_empty() { return Err(ioerr(format!("missing docs for --{}", arg.name))); } let first = format!(" {}", paragraphs[0].replace("\n", "\n ")); if paragraphs.len() == 1 { return Ok(first); } Ok(format!("{}\n+\n{}", first, paragraphs[1..].join("\n+\n"))) } fn ioerr(msg: String) -> io::Error { io::Error::new(io::ErrorKind::Other, msg) } ripgrep-11.0.2/ci/before_deploy.sh010075500017500000144000000040171351372666500152500ustar0000000000000000#!/bin/bash # package the build artifacts set -ex . "$(dirname $0)/utils.sh" # Generate artifacts for release mk_artifacts() { CARGO="$(builder)" if is_arm; then "$CARGO" build --target "$TARGET" --release else # Technically, MUSL builds will force PCRE2 to get statically compiled, # but we also want PCRE2 statically build for macOS binaries. PCRE2_SYS_STATIC=1 "$CARGO" build --target "$TARGET" --release --features 'pcre2' fi } mk_tarball() { # When cross-compiling, use the right `strip` tool on the binary. local gcc_prefix="$(gcc_prefix)" # Create a temporary dir that contains our staging area. # $tmpdir/$name is what eventually ends up as the deployed archive. local tmpdir="$(mktemp -d)" local name="${PROJECT_NAME}-${TRAVIS_TAG}-${TARGET}" local staging="$tmpdir/$name" mkdir -p "$staging"/{complete,doc} # The deployment directory is where the final archive will reside. # This path is known by the .travis.yml configuration. local out_dir="$(pwd)/deployment" mkdir -p "$out_dir" # Find the correct (most recent) Cargo "out" directory. The out directory # contains shell completion files and the man page. local cargo_out_dir="$(cargo_out_dir "target/$TARGET")" # Copy the ripgrep binary and strip it. cp "target/$TARGET/release/rg" "$staging/rg" "${gcc_prefix}strip" "$staging/rg" # Copy the licenses and README. cp {README.md,UNLICENSE,COPYING,LICENSE-MIT} "$staging/" # Copy documentation and man page. cp {CHANGELOG.md,FAQ.md,GUIDE.md} "$staging/doc/" if command -V a2x 2>&1 > /dev/null; then # The man page should only exist if we have asciidoc installed. cp "$cargo_out_dir/rg.1" "$staging/doc/" fi # Copy shell completion files. cp "$cargo_out_dir"/{rg.bash,rg.fish,_rg.ps1} "$staging/complete/" cp complete/_rg "$staging/complete/" (cd "$tmpdir" && tar czf "$out_dir/$name.tar.gz" "$name") rm -rf "$tmpdir" } main() { mk_artifacts mk_tarball } main ripgrep-11.0.2/ci/build_deb.sh010075500017500000144000000027031351372666500143430ustar0000000000000000#!/bin/bash set -e # This script builds a binary dpkg for Debian based distros. It does not # currently run in CI, and is instead run manually and the resulting dpkg is # uploaded to GitHub via the web UI. # # Note that this requires 'cargo deb', which can be installed with # 'cargo install cargo-deb'. # # This should be run from the root of the ripgrep repo. if ! command -V cargo-deb > /dev/null 2>&1; then echo "cargo-deb command missing" >&2 exit 1 fi # 'cargo deb' does not seem to provide a way to specify an asset that is # created at build time, such as ripgrep's man page. To work around this, # we force a debug build, copy out the man page (and shell completions) # produced from that build, put it into a predictable location and then build # the deb, which knows where to look. DEPLOY_DIR=deployment/deb mkdir -p "$DEPLOY_DIR" cargo build # Find and copy man page. manpage="$(find ./target/debug -name rg.1 -print0 | xargs -0 ls -t | head -n1)" cp "$manpage" "$DEPLOY_DIR/" # Do the same for shell completions. compbash="$(find ./target/debug -name rg.bash -print0 | xargs -0 ls -t | head -n1)" cp "$compbash" "$DEPLOY_DIR/" compfish="$(find ./target/debug -name rg.fish -print0 | xargs -0 ls -t | head -n1)" cp "$compfish" "$DEPLOY_DIR/" compzsh="complete/_rg" cp "$compzsh" "$DEPLOY_DIR/" # Since we're distributing the dpkg, we don't know whether the user will have # PCRE2 installed, so just do a static build. PCRE2_SYS_STATIC=1 cargo deb ripgrep-11.0.2/ci/docker/x86_64-unknown-linux-musl/Dockerfile010064400017500000144000000002651352066452400220740ustar0000000000000000FROM japaric/x86_64-unknown-linux-musl:v0.1.14 RUN apt-get update \ && apt-get install -y --no-install-recommends \ libxslt1-dev asciidoc docbook-xsl xsltproc libxml2-utils ripgrep-11.0.2/ci/install.sh010075500017500000144000000021331351372666500140750ustar0000000000000000#!/bin/bash # install stuff needed for the `script` phase # Where rustup gets installed. export PATH="$PATH:$HOME/.cargo/bin" set -ex . "$(dirname $0)/utils.sh" install_rustup() { curl https://sh.rustup.rs -sSf \ | sh -s -- -y --default-toolchain="$TRAVIS_RUST_VERSION" rustc -V cargo -V } install_targets() { if [ $(host) != "$TARGET" ]; then rustup target add $TARGET fi } install_osx_dependencies() { if ! is_osx; then return fi brew install asciidoc docbook-xsl } configure_cargo() { local prefix=$(gcc_prefix) if [ -n "${prefix}" ]; then local gcc_suffix= if [ -n "$GCC_VERSION" ]; then gcc_suffix="-$GCC_VERSION" fi local gcc="${prefix}gcc${gcc_suffix}" # information about the cross compiler "${gcc}" -v # tell cargo which linker to use for cross compilation mkdir -p .cargo cat >>.cargo/config <&2 exit 1 fi version="$1" # Linux and Darwin builds. for arch in i686 x86_64; do for target in apple-darwin unknown-linux-musl; do url="https://github.com/BurntSushi/ripgrep/releases/download/$version/ripgrep-$version-$arch-$target.tar.gz" sha=$(curl -sfSL "$url" | sha256sum) echo "$version-$arch-$target $sha" done done # Source. for ext in zip tar.gz; do url="https://github.com/BurntSushi/ripgrep/archive/$version.$ext" sha=$(curl -sfSL "$url" | sha256sum) echo "source.$ext $sha" done ripgrep-11.0.2/ci/test_complete.sh010075500017500000144000000060571351372666500153070ustar0000000000000000#!/usr/bin/env zsh emulate zsh -o extended_glob -o no_function_argzero -o no_unset ## # Compares options in `rg --help` output to options in zsh completion function get_comp_args() { # Technically there are many options that the completion system sets that # our function may rely on, but we'll trust that we've got it mostly right setopt local_options unset # Our completion function recognises a special variable which tells it to # dump the _arguments specs and then just return. But do this in a sub-shell # anyway to avoid any weirdness ( _RG_COMPLETE_LIST_ARGS=1 source $1 ) } main() { local diff local rg="${0:a:h}/../target/${TARGET:-}/release/rg" local _rg="${0:a:h}/../complete/_rg" local -a help_args comp_args [[ -e $rg ]] || rg=${rg/%\/release\/rg/\/debug\/rg} rg=${rg:a} _rg=${_rg:a} [[ -e $rg ]] || { print -r >&2 "File not found: $rg" return 1 } [[ -e $_rg ]] || { print -r >&2 "File not found: $_rg" return 1 } print -rl - 'Comparing options:' "-$rg" "+$_rg" # 'Parse' options out of the `--help` output. To prevent false positives we # only look at lines where the first non-white-space character is `-`, or # where a long option starting with certain letters (see `_rg`) is found. # Occasionally we may have to handle some manually, however help_args=( ${(f)"$( $rg --help | $rg -i -- '^\s+--?[a-z0-9]|--[imnp]' | $rg -ior '$1' -- $'[\t /\"\'`.,](-[a-z0-9]|--[a-z0-9-]+)\\b' | $rg -v -- --print0 | # False positives sort -u )"} ) # 'Parse' options out of the completion function comp_args=( ${(f)"$( get_comp_args $_rg )"} ) # Note that we currently exclude hidden (!...) options; matching these # properly against the `--help` output could be irritating comp_args=( ${comp_args#\(*\)} ) # Strip excluded options comp_args=( ${comp_args#\*} ) # Strip repetition indicator comp_args=( ${comp_args%%-[:[]*} ) # Strip everything after -optname- comp_args=( ${comp_args%%[:+=[]*} ) # Strip everything after other optspecs comp_args=( ${comp_args##[^-]*} ) # Remove non-options comp_args=( ${(f)"$( print -rl - $comp_args | sort -u )"} ) (( $#help_args )) || { print -r >&2 'Failed to get help_args' return 1 } (( $#comp_args )) || { print -r >&2 'Failed to get comp_args' return 1 } diff="$( if diff --help 2>&1 | grep -qF -- '--label'; then diff -U2 \ --label '`rg --help`' \ --label '`_rg`' \ =( print -rl - $help_args ) =( print -rl - $comp_args ) else diff -U2 \ -L '`rg --help`' \ -L '`_rg`' \ =( print -rl - $help_args ) =( print -rl - $comp_args ) fi )" (( $#diff )) && { printf >&2 '%s\n' 'zsh completion options differ from `--help` options:' printf >&2 '%s\n' $diff return 1 } printf 'OK\n' return 0 } main "$@" ripgrep-11.0.2/ci/utils.sh010064400017500000144000000036521351372666500135730ustar0000000000000000#!/bin/bash # Various utility functions used through CI. # Finds Cargo's `OUT_DIR` directory from the most recent build. # # This requires one parameter corresponding to the target directory # to search for the build output. cargo_out_dir() { # This works by finding the most recent stamp file, which is produced by # every ripgrep build. target_dir="$1" find "$target_dir" -name ripgrep-stamp -print0 \ | xargs -0 ls -t \ | head -n1 \ | xargs dirname } host() { case "$TRAVIS_OS_NAME" in linux) echo x86_64-unknown-linux-gnu ;; osx) echo x86_64-apple-darwin ;; esac } architecture() { case "$TARGET" in x86_64-*) echo amd64 ;; i686-*|i586-*|i386-*) echo i386 ;; arm*-unknown-linux-gnueabihf) echo armhf ;; *) die "architecture: unexpected target $TARGET" ;; esac } gcc_prefix() { case "$(architecture)" in armhf) echo arm-linux-gnueabihf- ;; *) return ;; esac } is_musl() { case "$TARGET" in *-musl) return 0 ;; *) return 1 ;; esac } is_x86() { case "$(architecture)" in amd64|i386) return 0 ;; *) return 1 ;; esac } is_x86_64() { case "$(architecture)" in amd64) return 0 ;; *) return 1 ;; esac } is_arm() { case "$(architecture)" in armhf) return 0 ;; *) return 1 ;; esac } is_linux() { case "$TRAVIS_OS_NAME" in linux) return 0 ;; *) return 1 ;; esac } is_osx() { case "$TRAVIS_OS_NAME" in osx) return 0 ;; *) return 1 ;; esac } builder() { if is_musl && is_x86_64; then cargo install cross echo "cross" else echo "cargo" fi } ripgrep-11.0.2/complete/_rg010064400017500000144000000663151352065255400140040ustar0000000000000000#compdef rg ## # zsh completion function for ripgrep # # Run ci/test_complete.sh after building to ensure that the options supported by # this function stay in synch with the `rg` binary. # # For convenience, a completion reference guide is included at the bottom of # this file. # # Originally based on code from the zsh-users project — see copyright notice # below. _rg() { local curcontext=$curcontext no='!' descr ret=1 local -a context line state state_descr args tmp suf local -A opt_args # ripgrep has many options which negate the effect of a more common one — for # example, `--no-column` to negate `--column`, and `--messages` to negate # `--no-messages`. There are so many of these, and they're so infrequently # used, that some users will probably find it irritating if they're completed # indiscriminately, so let's not do that unless either the current prefix # matches one of those negation options or the user has the `complete-all` # style set. Note that this prefix check has to be updated manually to account # for all of the potential negation options listed below! if # We also want to list all of these options during testing [[ $_RG_COMPLETE_LIST_ARGS == (1|t*|y*) ]] || # (--[imnp]* => --ignore*, --messages, --no-*, --pcre2-unicode) [[ $PREFIX$SUFFIX == --[imnp]* ]] || zstyle -t ":complete:$curcontext:*" complete-all then no= fi # We make heavy use of argument groups here to prevent the option specs from # growing unwieldy. These aren't supported in zsh <5.4, though, so we'll strip # them out below if necessary. This makes the exclusions inaccurate on those # older versions, but oh well — it's not that big a deal args=( + '(exclusive)' # Misc. fully exclusive options '(: * -)'{-h,--help}'[display help information]' '(: * -)'{-V,--version}'[display version information]' '(: * -)'--pcre2-version'[print the version of PCRE2 used by ripgrep, if available]' + '(buffered)' # buffering options '--line-buffered[force line buffering]' $no"--no-line-buffered[don't force line buffering]" '--block-buffered[force block buffering]' $no"--no-block-buffered[don't force block buffering]" + '(case)' # Case-sensitivity options {-i,--ignore-case}'[search case-insensitively]' {-s,--case-sensitive}'[search case-sensitively]' {-S,--smart-case}'[search case-insensitively if pattern is all lowercase]' + '(context-a)' # Context (after) options '(context-c)'{-A+,--after-context=}'[specify lines to show after each match]:number of lines' + '(context-b)' # Context (before) options '(context-c)'{-B+,--before-context=}'[specify lines to show before each match]:number of lines' + '(context-c)' # Context (combined) options '(context-a context-b)'{-C+,--context=}'[specify lines to show before and after each match]:number of lines' + '(column)' # Column options '--column[show column numbers for matches]' $no"--no-column[don't show column numbers for matches]" + '(count)' # Counting options {-c,--count}'[only show count of matching lines for each file]' '--count-matches[only show count of individual matches for each file]' + '(encoding)' # Encoding options {-E+,--encoding=}'[specify text encoding of files to search]: :_rg_encodings' $no'--no-encoding[use default text encoding]' + file # File-input options '(1)*'{-f+,--file=}'[specify file containing patterns to search for]: :_files' + '(file-match)' # Files with/without match options '(stats)'{-l,--files-with-matches}'[only show names of files with matches]' '(stats)--files-without-match[only show names of files without matches]' + '(file-name)' # File-name options {-H,--with-filename}'[show file name for matches]' {-I,--no-filename}"[don't show file name for matches]" + '(file-system)' # File system options "--one-file-system[don't descend into directories on other file systems]" $no'--no-one-file-system[descend into directories on other file systems]' + '(fixed)' # Fixed-string options {-F,--fixed-strings}'[treat pattern as literal string instead of regular expression]' $no"--no-fixed-strings[don't treat pattern as literal string]" + '(follow)' # Symlink-following options {-L,--follow}'[follow symlinks]' $no"--no-follow[don't follow symlinks]" + glob # File-glob options '*'{-g+,--glob=}'[include/exclude files matching specified glob]:glob' '*--iglob=[include/exclude files matching specified case-insensitive glob]:glob' + '(glob-case-insensitive)' # File-glob case sensitivity options '--glob-case-insensitive[treat -g/--glob patterns case insensitively]' $no'--no-glob-case-insensitive[treat -g/--glob patterns case sensitively]' + '(heading)' # Heading options '(pretty-vimgrep)--heading[show matches grouped by file name]' "(pretty-vimgrep)--no-heading[don't show matches grouped by file name]" + '(hidden)' # Hidden-file options '--hidden[search hidden files and directories]' $no"--no-hidden[don't search hidden files and directories]" + '(hybrid)' # hybrid regex options '--auto-hybrid-regex[dynamically use PCRE2 if necessary]' $no"--no-auto-hybrid-regex[don't dynamically use PCRE2 if necessary]" + '(ignore)' # Ignore-file options "(--no-ignore-global --no-ignore-parent --no-ignore-vcs --no-ignore-dot)--no-ignore[don't respect ignore files]" $no'(--ignore-global --ignore-parent --ignore-vcs --ignore-dot)--ignore[respect ignore files]' + '(ignore-file-case-insensitive)' # Ignore-file case sensitivity options '--ignore-file-case-insensitive[process ignore files case insensitively]' $no'--no-ignore-file-case-insensitive[process ignore files case sensitively]' + '(ignore-global)' # Global ignore-file options "--no-ignore-global[don't respect global ignore files]" $no'--ignore-global[respect global ignore files]' + '(ignore-parent)' # Parent ignore-file options "--no-ignore-parent[don't respect ignore files in parent directories]" $no'--ignore-parent[respect ignore files in parent directories]' + '(ignore-vcs)' # VCS ignore-file options "--no-ignore-vcs[don't respect version control ignore files]" $no'--ignore-vcs[respect version control ignore files]' + '(ignore-dot)' # .ignore-file options "--no-ignore-dot[don't respect .ignore files]" $no'--ignore-dot[respect .ignore files]' + '(json)' # JSON options '--json[output results in JSON Lines format]' $no"--no-json[don't output results in JSON Lines format]" + '(line-number)' # Line-number options {-n,--line-number}'[show line numbers for matches]' {-N,--no-line-number}"[don't show line numbers for matches]" + '(line-terminator)' # Line-terminator options '--crlf[use CRLF as line terminator]' $no"--no-crlf[don't use CRLF as line terminator]" '(text)--null-data[use NUL as line terminator]' + '(max-columns-preview)' # max column preview options '--max-columns-preview[show preview for long lines (with -M)]' $no"--no-max-columns-preview[don't show preview for long lines (with -M)]" + '(max-depth)' # Directory-depth options '--max-depth=[specify max number of directories to descend]:number of directories' '!--maxdepth=:number of directories' + '(messages)' # Error-message options '(--no-ignore-messages)--no-messages[suppress some error messages]' $no"--messages[don't suppress error messages affected by --no-messages]" + '(messages-ignore)' # Ignore-error message options "--no-ignore-messages[don't show ignore-file parse error messages]" $no'--ignore-messages[show ignore-file parse error messages]' + '(mmap)' # mmap options '--mmap[search using memory maps when possible]' "--no-mmap[don't search using memory maps]" + '(multiline)' # Multiline options {-U,--multiline}'[permit matching across multiple lines]' $no'(multiline-dotall)--no-multiline[restrict matches to at most one line each]' + '(multiline-dotall)' # Multiline DOTALL options '(--no-multiline)--multiline-dotall[allow "." to match newline (with -U)]' $no"(--no-multiline)--no-multiline-dotall[don't allow \".\" to match newline (with -U)]" + '(only)' # Only-match options {-o,--only-matching}'[show only matching part of each line]' + '(passthru)' # Pass-through options '(--vimgrep)--passthru[show both matching and non-matching lines]' '!(--vimgrep)--passthrough' + '(pcre2)' # PCRE2 options {-P,--pcre2}'[enable matching with PCRE2]' $no'(pcre2-unicode)--no-pcre2[disable matching with PCRE2]' + '(pcre2-unicode)' # PCRE2 Unicode options $no'(--no-pcre2 --no-pcre2-unicode)--pcre2-unicode[enable PCRE2 Unicode mode (with -P)]' '(--no-pcre2 --pcre2-unicode)--no-pcre2-unicode[disable PCRE2 Unicode mode (with -P)]' + '(pre)' # Preprocessing options '(-z --search-zip)--pre=[specify preprocessor utility]:preprocessor utility:_command_names -e' $no'--no-pre[disable preprocessor utility]' + pre-glob # Preprocessing glob options '*--pre-glob[include/exclude files for preprocessing with --pre]' + '(pretty-vimgrep)' # Pretty/vimgrep display options '(heading)'{-p,--pretty}'[alias for --color=always --heading -n]' '(heading passthru)--vimgrep[show results in vim-compatible format]' + regexp # Explicit pattern options '(1 file)*'{-e+,--regexp=}'[specify pattern]:pattern' + '(replace)' # Replacement options {-r+,--replace=}'[specify string used to replace matches]:replace string' + '(sort)' # File-sorting options '(threads)--sort=[sort results in ascending order (disables parallelism)]:sort method:(( none\:"no sorting" path\:"sort by file path" modified\:"sort by last modified time" accessed\:"sort by last accessed time" created\:"sort by creation time" ))' '(threads)--sortr=[sort results in descending order (disables parallelism)]:sort method:(( none\:"no sorting" path\:"sort by file path" modified\:"sort by last modified time" accessed\:"sort by last accessed time" created\:"sort by creation time" ))' '!(threads)--sort-files[sort results by file path (disables parallelism)]' + '(stats)' # Statistics options '(--files file-match)--stats[show search statistics]' $no"--no-stats[don't show search statistics]" + '(text)' # Binary-search options {-a,--text}'[search binary files as if they were text]' "--binary[search binary files, don't print binary data]" $no"--no-binary[don't search binary files]" $no"(--null-data)--no-text[don't search binary files as if they were text]" + '(threads)' # Thread-count options '(sort)'{-j+,--threads=}'[specify approximate number of threads to use]:number of threads' + '(trim)' # Trim options '--trim[trim any ASCII whitespace prefix from each line]' $no"--no-trim[don't trim ASCII whitespace prefix from each line]" + type # Type options '*'{-t+,--type=}'[only search files matching specified type]: :_rg_types' '*--type-add=[add new glob for specified file type]: :->typespec' '*--type-clear=[clear globs previously defined for specified file type]: :_rg_types' # This should actually be exclusive with everything but other type options '(: *)--type-list[show all supported file types and their associated globs]' '*'{-T+,--type-not=}"[don't search files matching specified file type]: :_rg_types" + '(word-line)' # Whole-word/line match options {-w,--word-regexp}'[only show matches surrounded by word boundaries]' {-x,--line-regexp}'[only show matches surrounded by line boundaries]' + '(zip)' # Compression options '(--pre)'{-z,--search-zip}'[search in compressed files]' $no"--no-search-zip[don't search in compressed files]" + misc # Other options — no need to separate these at the moment '(-b --byte-offset)'{-b,--byte-offset}'[show 0-based byte offset for each matching line]' '--color=[specify when to use colors in output]:when:(( never\:"never use colors" auto\:"use colors or not based on stdout, TERM, etc." always\:"always use colors" ansi\:"always use ANSI colors (even on Windows)" ))' '*--colors=[specify color and style settings]: :->colorspec' '--context-separator=[specify string used to separate non-continuous context lines in output]:separator' '--debug[show debug messages]' '--dfa-size-limit=[specify upper size limit of generated DFA]:DFA size (bytes)' "(1 stats)--files[show each file that would be searched (but don't search)]" '*--ignore-file=[specify additional ignore file]:ignore file:_files' '(-v --invert-match)'{-v,--invert-match}'[invert matching]' '(-M --max-columns)'{-M+,--max-columns=}'[specify max length of lines to print]:number of bytes' '(-m --max-count)'{-m+,--max-count=}'[specify max number of matches per file]:number of matches' '--max-filesize=[specify size above which files should be ignored]:file size (bytes)' "--no-config[don't load configuration files]" '(-0 --null)'{-0,--null}'[print NUL byte after file names]' '--path-separator=[specify path separator to use when printing file names]:separator' '(-q --quiet)'{-q,--quiet}'[suppress normal output]' '--regex-size-limit=[specify upper size limit of compiled regex]:regex size (bytes)' '*'{-u,--unrestricted}'[reduce level of "smart" searching]' + operand # Operands '(--files --type-list file regexp)1: :_guard "^-*" pattern' '(--type-list)*: :_files' ) # This is used with test_complete.sh to verify that there are no options # listed in the help output that aren't also defined here [[ $_RG_COMPLETE_LIST_ARGS == (1|t*|y*) ]] && { print -rl - $args return 0 } # Strip out argument groups where unsupported (see above) [[ $ZSH_VERSION == (4|5.<0-3>)(.*)# ]] && args=( ${(@)args:#(#i)(+|[a-z0-9][a-z0-9_-]#|\([a-z0-9][a-z0-9_-]#\))} ) _arguments -C -s -S : $args && ret=0 case $state in colorspec) if [[ ${IPREFIX#--*=}$PREFIX == [^:]# ]]; then suf=( -qS: ) tmp=( 'column:specify coloring for column numbers' 'line:specify coloring for line numbers' 'match:specify coloring for match text' 'path:specify coloring for file names' ) descr='color/style type' elif [[ ${IPREFIX#--*=}$PREFIX == (column|line|match|path):[^:]# ]]; then suf=( -qS: ) tmp=( 'none:clear color/style for type' 'bg:specify background color' 'fg:specify foreground color' 'style:specify text style' ) descr='color/style attribute' elif [[ ${IPREFIX#--*=}$PREFIX == [^:]##:(bg|fg):[^:]# ]]; then tmp=( black blue green red cyan magenta yellow white ) descr='color name or r,g,b' elif [[ ${IPREFIX#--*=}$PREFIX == [^:]##:style:[^:]# ]]; then tmp=( {,no}bold {,no}intense {,no}underline ) descr='style name' else _message -e colorspec 'no more arguments' fi (( $#tmp )) && { compset -P '*:' _describe -t colorspec $descr tmp $suf && ret=0 } ;; typespec) if compset -P '[^:]##:include:'; then _sequence -s , _rg_types && ret=0 # @todo This bit in particular could be better, but it's a little # complex, and attempting to solve it seems to run us up against a crash # bug — zsh # 40362 elif compset -P '[^:]##:'; then _message 'glob or include directive' && ret=1 elif [[ ! -prefix *:* ]]; then _rg_types -qS : && ret=0 fi ;; esac return ret } # Complete encodings _rg_encodings() { local -a expl local -aU _encodings # This is impossible to read, but these encodings rarely if ever change, so it # probably doesn't matter. They are derived from the list given here: # https://encoding.spec.whatwg.org/#concept-encoding-get _encodings=( {{,us-}ascii,arabic,chinese,cyrillic,greek{,8},hebrew,korean} logical visual mac {,cs}macintosh x-mac-{cyrillic,roman,ukrainian} 866 ibm{819,866} csibm866 big5{,-hkscs} {cn-,cs}big5 x-x-big5 cp{819,866,125{0..8}} x-cp125{0..8} csiso2022{jp,kr} csiso8859{6,8}{e,i} csisolatin{{1..6},9} csisolatin{arabic,cyrillic,greek,hebrew} ecma-{114,118} asmo-708 elot_928 sun_eu_greek euc-{jp,kr} x-euc-jp cseuckr cseucpkdfmtjapanese {,x-}gbk csiso58gb231280 gb18030 {,cs}gb2312 gb_2312{,-80} hz-gb-2312 iso-2022-{cn,cn-ext,jp,kr} iso8859{,-}{{1..11},13,14,15} iso-8859-{{1..11},{6,8}-{e,i},13,14,15,16} iso_8859-{{1..9},15} iso_8859-{1,2,6,7}:1987 iso_8859-{3,4,5,8}:1988 iso_8859-9:1989 iso-ir-{58,100,101,109,110,126,127,138,144,148,149,157} koi{,8,8-r,8-ru,8-u,8_r} cskoi8r ks_c_5601-{1987,1989} ksc{,_}5691 csksc56011987 latin{1..6} l{{1..6},9} shift{-,_}jis csshiftjis {,x-}sjis ms_kanji ms932 utf{,-}8 utf-16{,be,le} unicode-1-1-utf-8 windows-{31j,874,949,125{0..8}} dos-874 tis-620 ansi_x3.4-1968 x-user-defined auto none ) _wanted encodings expl encoding compadd -a "$@" - _encodings } # Complete file types _rg_types() { local -a expl local -aU _types _types=( ${(@)${(f)"$( _call_program types rg --type-list )"}%%:*} ) _wanted types expl 'file type' compadd -a "$@" - _types } _rg "$@" ################################################################################ # ZSH COMPLETION REFERENCE # # For the convenience of developers who aren't especially familiar with zsh # completion functions, a brief reference guide follows. This is in no way # comprehensive; it covers just enough of the basic structure, syntax, and # conventions to help someone make simple changes like adding new options. For # more complete documentation regarding zsh completion functions, please see the # following: # # * http://zsh.sourceforge.net/Doc/Release/Completion-System.html # * https://github.com/zsh-users/zsh/blob/master/Etc/completion-style-guide # # OVERVIEW # # Most zsh completion functions are defined in terms of `_arguments`, which is a # shell function that takes a series of argument specifications. The specs for # `rg` are stored in an array, which is common for more complex functions; the # elements of the array are passed to `_arguments` on invocation. # # ARGUMENT-SPECIFICATION SYNTAX # # The following is a contrived example of the argument specs for a simple tool: # # '(: * -)'{-h,--help}'[display help information]' # '(-q -v --quiet --verbose)'{-q,--quiet}'[decrease output verbosity]' # '!(-q -v --quiet --verbose)--silent' # '(-q -v --quiet --verbose)'{-v,--verbose}'[increase output verbosity]' # '--color=[specify when to use colors]:when:(always never auto)' # '*:example file:_files' # # Although there may appear to be six specs here, there are actually nine; we # use brace expansion to combine specs for options that go by multiple names, # like `-q` and `--quiet`. This is customary, and ties in with the fact that zsh # merges completion possibilities together when they have the same description. # # The first line defines the option `-h`/`--help`. With most tools, it isn't # useful to complete anything after `--help` because it effectively overrides # all others; the `(: * -)` at the beginning of the spec tells zsh not to # complete any other operands (`:` and `*`) or options (`-`) after this one has # been used. The `[...]` at the end associates a description with `-h`/`--help`; # as mentioned, zsh will see the identical descriptions and merge these options # together when offering completion possibilities. # # The next line defines `-q`/`--quiet`. Here we don't want to suppress further # completions entirely, but we don't want to offer `-q` if `--quiet` has been # given (since they do the same thing), nor do we want to offer `-v` (since it # doesn't make sense to be quiet and verbose at the same time). We don't need to # tell zsh not to offer `--quiet` a second time, since that's the default # behaviour, but since this line expands to two specs describing `-q` *and* # `--quiet` we do need to explicitly list all of them here. # # The next line defines a hidden option `--silent` — maybe it's a deprecated # synonym for `--quiet`. The leading `!` indicates that zsh shouldn't offer this # option during completion. The benefit of providing a spec for an option that # shouldn't be completed is that, if someone *does* use it, we can correctly # suppress completion of other options afterwards. # # The next line defines `-v`/`--verbose`; this works just like `-q`/`--quiet`. # # The next line defines `--color`. In this example, `--color` doesn't have a # corresponding short option, so we don't need to use brace expansion. Further, # there are no other options it's exclusive with (just itself), so we don't need # to define those at the beginning. However, it does take a mandatory argument. # The `=` at the end of `--color=` indicates that the argument may appear either # like `--color always` or like `--color=always`; this is how most GNU-style # command-line tools work. The corresponding short option would normally use `+` # — for example, `-c+` would allow either `-c always` or `-calways`. For this # option, the arguments are known ahead of time, so we can simply list them in # parentheses at the end (`when` is used as the description for the argument). # # The last line defines an operand (a non-option argument). In this example, the # operand can be used any number of times (the leading `*`), and it should be a # file path, so we tell zsh to call the `_files` function to complete it. The # `example file` in the middle is the description to use for this operand; we # could use a space instead to accept the default provided by `_files`. # # GROUPING ARGUMENT SPECIFICATIONS # # Newer versions of zsh support grouping argument specs together. All specs # following a `+` and then a group name are considered to be members of the # named group. Grouping is useful mostly for organisational purposes; it makes # the relationship between different options more obvious, and makes it easier # to specify exclusions. # # We could rewrite our example above using grouping as follows: # # '(: * -)'{-h,--help}'[display help information]' # '--color=[specify when to use colors]:when:(always never auto)' # '*:example file:_files' # + '(verbosity)' # {-q,--quiet}'[decrease output verbosity]' # '!--silent' # {-v,--verbose}'[increase output verbosity]' # # Here we take advantage of a useful feature of spec grouping — when the group # name is surrounded by parentheses, as in `(verbosity)`, it tells zsh that all # of the options in that group are exclusive with each other. As a result, we # don't need to manually list out the exclusions at the beginning of each # option. # # Groups can also be referred to by name in other argument specs; for example: # # '(xyz)--aaa' '*: :_files' # + xyz --xxx --yyy --zzz # # Here we use the group name `xyz` to tell zsh that `--xxx`, `--yyy`, and # `--zzz` are not to be completed after `--aaa`. This makes the exclusion list # much more compact and reusable. # # CONVENTIONS # # zsh completion functions generally adhere to the following conventions: # # * Use two spaces for indentation # * Combine specs for options with different names using brace expansion # * In combined specs, list the short option first (as in `{-a,--text}`) # * Use `+` or `=` as described above for options that take arguments # * Provide a description for all options, option-arguments, and operands # * Capitalise/punctuate argument descriptions as phrases, not complete # sentences — 'display help information', never 'Display help information.' # (but still capitalise acronyms and proper names) # * Write argument descriptions as verb phrases — 'display x', 'enable y', # 'use z' # * Word descriptions to make it clear when an option expects an argument; # usually this is done with the word 'specify', as in 'specify x' or # 'use specified x') # * Write argument descriptions as tersely as possible — for example, articles # like 'a' and 'the' should be omitted unless it would be confusing # # Other conventions currently used by this function: # # * Order argument specs alphabetically by group name, then option name # * Group options that are directly related, mutually exclusive, or frequently # referenced by other argument specs # * Use only characters in the set [a-z0-9_-] in group names # * Order exclusion lists as follows: short options, long options, groups # * Use American English in descriptions # * Use 'don't' in descriptions instead of 'do not' # * Word descriptions for related options as similarly as possible. For example, # `--foo[enable foo]` and `--no-foo[disable foo]`, or `--foo[use foo]` and # `--no-foo[don't use foo]` # * Word descriptions to make it clear when an option only makes sense with # another option, usually by adding '(with -x)' to the end # * Don't quote strings or variables unnecessarily. When quotes are required, # prefer single-quotes to double-quotes # * Prefix option specs with `$no` when the option serves only to negate the # behaviour of another option that must be provided explicitly by the user. # This prevents rarely used options from cluttering up the completion menu ################################################################################ # ------------------------------------------------------------------------------ # Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of the zsh-users nor the # names of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ------------------------------------------------------------------------------ # Description # ----------- # # Completion script for ripgrep # # ------------------------------------------------------------------------------ # Authors # ------- # # * arcizan # * MaskRay # # ------------------------------------------------------------------------------ # Local Variables: # mode: shell-script # coding: utf-8-unix # indent-tabs-mode: nil # sh-indentation: 2 # sh-basic-offset: 2 # End: # vim: ft=zsh sw=2 ts=2 et ripgrep-11.0.2/doc/rg.1.txt.tpl010064400017500000144000000166731351372666500143660ustar0000000000000000rg(1) ===== Name ---- rg - recursively search current directory for lines matching a pattern Synopsis -------- *rg* [_OPTIONS_] _PATTERN_ [_PATH_...] *rg* [_OPTIONS_] *-e* _PATTERN_... [_PATH_...] *rg* [_OPTIONS_] *-f* _PATTERNFILE_... [_PATH_...] *rg* [_OPTIONS_] *--files* [_PATH_...] *rg* [_OPTIONS_] *--type-list* *command* | *rg* [_OPTIONS_] _PATTERN_ *rg* [_OPTIONS_] *--help* *rg* [_OPTIONS_] *--version* DESCRIPTION ----------- ripgrep (rg) recursively searches your current directory for a regex pattern. By default, ripgrep will respect your .gitignore and automatically skip hidden files/directories and binary files. ripgrep's default regex engine uses finite automata and guarantees linear time searching. Because of this, features like backreferences and arbitrary look-around are not supported. However, if ripgrep is built with PCRE2, then the *--pcre2* flag can be used to enable backreferences and look-around. ripgrep supports configuration files. Set *RIPGREP_CONFIG_PATH* to a configuration file. The file can specify one shell argument per line. Lines starting with *#* are ignored. For more details, see the man page or the *README*. Tip: to disable all smart filtering and make ripgrep behave a bit more like classical grep, use *rg -uuu*. REGEX SYNTAX ------------ ripgrep uses Rust's regex engine by default, which documents its syntax: https://docs.rs/regex/*/regex/#syntax ripgrep uses byte-oriented regexes, which has some additional documentation: https://docs.rs/regex/*/regex/bytes/index.html#syntax To a first approximation, ripgrep uses Perl-like regexes without look-around or backreferences. This makes them very similar to the "extended" (ERE) regular expressions supported by *egrep*, but with a few additional features like Unicode character classes. If you're using ripgrep with the *--pcre2* flag, then please consult https://www.pcre.org or the PCRE2 man pages for documentation on the supported syntax. POSITIONAL ARGUMENTS -------------------- _PATTERN_:: A regular expression used for searching. To match a pattern beginning with a dash, use the -e/--regexp option. _PATH_:: A file or directory to search. Directories are searched recursively. Paths specified explicitly on the command line override glob and ignore rules. OPTIONS ------- Note that for many options, there exist flags to disable them. In some cases, those flags are not listed in a first class way below. For example, the *--column* flag (listed below) enables column numbers in ripgrep's output, but the *--no-column* flag (not listed below) disables them. The reverse can also exist. For example, the *--no-ignore* flag (listed below) disables ripgrep's *gitignore* logic, but the *--ignore* flag (not listed below) enables it. These flags are useful for overriding a ripgrep configuration file on the command line. Each flag's documentation notes whether an inverted flag exists. In all cases, the flag specified last takes precedence. {OPTIONS} EXIT STATUS ----------- If ripgrep finds a match, then the exit status of the program is 0. If no match could be found, then the exit status is 1. If an error occurred, then the exit status is always 2 unless ripgrep was run with the *--quiet* flag and a match was found. In summary: * `0` exit status occurs only when at least one match was found, and if no error occurred, unless *--quiet* was given. * `1` exit status occurs only when no match was found and no error occurred. * `2` exit status occurs when an error occurred. This is true for both catastrophic errors (e.g., a regex syntax error) and for soft errors (e.g., unable to read a file). CONFIGURATION FILES ------------------- ripgrep supports reading configuration files that change ripgrep's default behavior. The format of the configuration file is an "rc" style and is very simple. It is defined by two rules: 1. Every line is a shell argument, after trimming whitespace. 2. Lines starting with *#* (optionally preceded by any amount of whitespace) are ignored. ripgrep will look for a single configuration file if and only if the *RIPGREP_CONFIG_PATH* environment variable is set and is non-empty. ripgrep will parse shell arguments from this file on startup and will behave as if the arguments in this file were prepended to any explicit arguments given to ripgrep on the command line. For example, if your ripgreprc file contained a single line: --smart-case then the following command RIPGREP_CONFIG_PATH=wherever/.ripgreprc rg foo would behave identically to the following command rg --smart-case foo another example is adding types --type-add web:*.{html,css,js}* would behave identically to the following command rg --type-add 'web:*.{html,css,js}*' foo same with using globs --glob=!git/* or --glob !git/* would behave identically to the following command rg --glob '!git/*' foo ripgrep also provides a flag, *--no-config*, that when present will suppress any and all support for configuration. This includes any future support for auto-loading configuration files from pre-determined paths. Conflicts between configuration files and explicit arguments are handled exactly like conflicts in the same command line invocation. That is, this command: RIPGREP_CONFIG_PATH=wherever/.ripgreprc rg foo --case-sensitive is exactly equivalent to rg --smart-case foo --case-sensitive in which case, the *--case-sensitive* flag would override the *--smart-case* flag. SHELL COMPLETION ---------------- Shell completion files are included in the release tarball for Bash, Fish, Zsh and PowerShell. For *bash*, move *rg.bash* to *$XDG_CONFIG_HOME/bash_completion* or */etc/bash_completion.d/*. For *fish*, move *rg.fish* to *$HOME/.config/fish/completions*. For *zsh*, move *_rg* to one of your *$fpath* directories. CAVEATS ------- ripgrep may abort unexpectedly when using default settings if it searches a file that is simultaneously truncated. This behavior can be avoided by passing the *--no-mmap* flag which will forcefully disable the use of memory maps in all cases. ripgrep may use a large amount of memory depending on a few factors. Firstly, if ripgrep uses parallelism for search (the default), then the entire output for each individual file is buffered into memory in order to prevent interleaving matches in the output. To avoid this, you can disable parallelism with the *-j1* flag. Secondly, ripgrep always needs to have at least a single line in memory in order to execute a search. A file with a very long line can thus cause ripgrep to use a lot of memory. Generally, this only occurs when searching binary data with the *-a* flag enabled. (When the *-a* flag isn't enabled, ripgrep will replace all NUL bytes with line terminators, which typically prevents exorbitant memory usage.) Thirdly, when ripgrep searches a large file using a memory map, the process will report its resident memory usage as the size of the file. However, this does not mean ripgrep actually needed to use that much memory; the operating system will generally handle this for you. VERSION ------- {VERSION} HOMEPAGE -------- https://github.com/BurntSushi/ripgrep Please report bugs and feature requests in the issue tracker. Please do your best to provide a reproducible test case for bugs. This should include the corpus being searched, the *rg* command, the actual output and the expected output. Please also include the output of running the same *rg* command but with the *--debug* flag. AUTHORS ------- Andrew Gallant ripgrep-11.0.2/pkg/brew/ripgrep-bin.rb010064400017500000144000000015231351372666500157620ustar0000000000000000class RipgrepBin < Formula version '11.0.1' desc "Recursively search directories for a regex pattern." homepage "https://github.com/BurntSushi/ripgrep" if OS.mac? url "https://github.com/BurntSushi/ripgrep/releases/download/#{version}/ripgrep-#{version}-x86_64-apple-darwin.tar.gz" sha256 "92446c6b28b6c726f91ad66a03bcd533fc6e1a28ef4b44c27bfe2d49a0f88531" elsif OS.linux? url "https://github.com/BurntSushi/ripgrep/releases/download/#{version}/ripgrep-#{version}-x86_64-unknown-linux-musl.tar.gz" sha256 "ce74cabac9b39b1ad55837ec01e2c670fa7e965772ac2647b209e31ead19008c" end conflicts_with "ripgrep" def install bin.install "rg" man1.install "doc/rg.1" bash_completion.install "complete/rg.bash" fish_completion.install "complete/rg.fish" zsh_completion.install "complete/_rg" end end ripgrep-11.0.2/rustfmt.toml010064400017500000144000000000361351372666500140760ustar0000000000000000disable_all_formatting = true ripgrep-11.0.2/scripts/copy-examples010075500017500000144000000021321351372666500156770ustar0000000000000000#!/usr/bin/env python from __future__ import absolute_import, division, print_function import argparse import codecs import os.path import re RE_EACH_CODE_BLOCK = re.compile( r'(?s)(?:```|\{\{< high rust[^>]+>\}\})[^\n]*\n(.*?)(?:```|\{\{< /high >\}\})' # noqa ) RE_MARKER = re.compile(r'^(?:# )?//([^/].*)$') RE_STRIP_COMMENT = re.compile(r'^# ?') if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('--rust-file', default='src/cookbook.rs') p.add_argument('--example-dir', default='grep/examples') args = p.parse_args() with codecs.open(args.rust_file, encoding='utf-8') as f: rustcode = f.read() for m in RE_EACH_CODE_BLOCK.finditer(rustcode): lines = m.group(1).splitlines() marker, codelines = lines[0], lines[1:] m = RE_MARKER.search(marker) if m is None: continue code = '\n'.join(RE_STRIP_COMMENT.sub('', line) for line in codelines) fpath = os.path.join(args.example_dir, m.group(1)) with codecs.open(fpath, mode='w+', encoding='utf-8') as f: print(code, file=f) ripgrep-11.0.2/snapcraft.yaml010064400017500000144000000010261351372666500143420ustar0000000000000000name: ripgrep # you probably want to 'snapcraft register ' version: '0.8.1' # just for humans, typically '1.2+git' or '1.3.2' summary: Fast file searcher # 79 char long summary description: | ripgrep combines the usability of The Silver Searcher with the raw speed of grep. grade: stable # must be 'stable' to release into candidate/stable channels confinement: classic # use 'strict' once you have the right plugs and slots parts: ripgrep: plugin: rust source: . apps: rg: adapter: none command: ./bin/rg ripgrep-11.0.2/src/app.rs010064400017500000144000002726161352065517400134230ustar0000000000000000// This module defines the set of command line arguments that ripgrep supports, // including some light validation. // // This module is purposely written in a bare-bones way, since it is included // in ripgrep's build.rs file as a way to generate a man page and completion // files for common shells. // // The only other place that ripgrep deals with clap is in src/args.rs, which // is where we read clap's configuration from the end user's arguments and turn // it into a ripgrep-specific configuration type that is not coupled with clap. use clap::{self, App, AppSettings, crate_authors, crate_version}; use lazy_static::lazy_static; const ABOUT: &str = " ripgrep (rg) recursively searches your current directory for a regex pattern. By default, ripgrep will respect your .gitignore and automatically skip hidden files/directories and binary files. ripgrep's default regex engine uses finite automata and guarantees linear time searching. Because of this, features like backreferences and arbitrary look-around are not supported. However, if ripgrep is built with PCRE2, then the --pcre2 flag can be used to enable backreferences and look-around. ripgrep supports configuration files. Set RIPGREP_CONFIG_PATH to a configuration file. The file can specify one shell argument per line. Lines starting with '#' are ignored. For more details, see the man page or the README. Tip: to disable all smart filtering and make ripgrep behave a bit more like classical grep, use 'rg -uuu'. Project home page: https://github.com/BurntSushi/ripgrep Use -h for short descriptions and --help for more details."; const USAGE: &str = " rg [OPTIONS] PATTERN [PATH ...] rg [OPTIONS] [-e PATTERN ...] [-f PATTERNFILE ...] [PATH ...] rg [OPTIONS] --files [PATH ...] rg [OPTIONS] --type-list command | rg [OPTIONS] PATTERN"; const TEMPLATE: &str = "\ {bin} {version} {author} {about} USAGE:{usage} ARGS: {positionals} OPTIONS: {unified}"; /// Build a clap application parameterized by usage strings. pub fn app() -> App<'static, 'static> { // We need to specify our version in a static because we've painted clap // into a corner. We've told it that every string we give it will be // 'static, but we need to build the version string dynamically. We can // fake the 'static lifetime with lazy_static. lazy_static! { static ref LONG_VERSION: String = long_version(None); } let mut app = App::new("ripgrep") .author(crate_authors!()) .version(crate_version!()) .long_version(LONG_VERSION.as_str()) .about(ABOUT) .max_term_width(100) .setting(AppSettings::UnifiedHelpMessage) .setting(AppSettings::AllArgsOverrideSelf) .usage(USAGE) .template(TEMPLATE) .help_message("Prints help information. Use --help for more details."); for arg in all_args_and_flags() { app = app.arg(arg.claparg); } app } /// Return the "long" format of ripgrep's version string. /// /// If a revision hash is given, then it is used. If one isn't given, then /// the RIPGREP_BUILD_GIT_HASH env var is inspected for it. If that isn't set, /// then a revision hash is not included in the version string returned. pub fn long_version(revision_hash: Option<&str>) -> String { // Do we have a git hash? // (Yes, if ripgrep was built on a machine with `git` installed.) let hash = match revision_hash.or(option_env!("RIPGREP_BUILD_GIT_HASH")) { None => String::new(), Some(githash) => format!(" (rev {})", githash), }; // Put everything together. let runtime = runtime_cpu_features(); if runtime.is_empty() { format!( "{}{}\n{} (compiled)", crate_version!(), hash, compile_cpu_features().join(" ") ) } else { format!( "{}{}\n{} (compiled)\n{} (runtime)", crate_version!(), hash, compile_cpu_features().join(" "), runtime.join(" ") ) } } /// Returns the relevant CPU features enabled at compile time. fn compile_cpu_features() -> Vec<&'static str> { let mut features = vec![]; if cfg!(feature = "simd-accel") { features.push("+SIMD"); } else { features.push("-SIMD"); } if cfg!(feature = "avx-accel") { features.push("+AVX"); } else { features.push("-AVX"); } features } /// Returns the relevant CPU features enabled at runtime. #[cfg(target_arch = "x86_64")] fn runtime_cpu_features() -> Vec<&'static str> { // This is kind of a dirty violation of abstraction, since it assumes // knowledge about what specific SIMD features are being used. let mut features = vec![]; if is_x86_feature_detected!("ssse3") { features.push("+SIMD"); } else { features.push("-SIMD"); } if is_x86_feature_detected!("avx2") { features.push("+AVX"); } else { features.push("-AVX"); } features } /// Returns the relevant CPU features enabled at runtime. #[cfg(not(target_arch = "x86_64"))] fn runtime_cpu_features() -> Vec<&'static str> { vec![] } /// Arg is a light alias for a clap::Arg that is specialized to compile time /// string literals. type Arg = clap::Arg<'static, 'static>; /// RGArg is a light wrapper around a clap::Arg and also contains some metadata /// about the underlying Arg so that it can be inspected for other purposes /// (e.g., hopefully generating a man page). /// /// Note that this type is purposely overly constrained to ripgrep's particular /// use of clap. #[allow(dead_code)] #[derive(Clone)] pub struct RGArg { /// The underlying clap argument. claparg: Arg, /// The name of this argument. This is always present and is the name /// used in the code to find the value of an argument at runtime. pub name: &'static str, /// A short documentation string describing this argument. This string /// should fit on a single line and be a complete sentence. /// /// This is shown in the `-h` output. pub doc_short: &'static str, /// A longer documentation string describing this argument. This usually /// starts with the contents of `doc_short`. This is also usually many /// lines, potentially paragraphs, and may contain examples and additional /// prose. /// /// This is shown in the `--help` output. pub doc_long: &'static str, /// Whether this flag is hidden or not. /// /// This is typically used for uncommon flags that only serve to override /// other flags. For example, --no-ignore is a prominent flag that disables /// ripgrep's gitignore functionality, but --ignore re-enables it. Since /// gitignore support is enabled by default, use of the --ignore flag is /// somewhat niche and relegated to special cases when users make use of /// configuration files to set defaults. /// /// Generally, these flags should be documented in the documentation for /// the flag they override. pub hidden: bool, /// The type of this argument. pub kind: RGArgKind, } /// The kind of a ripgrep argument. /// /// This can be one of three possibilities: a positional argument, a boolean /// switch flag or a flag that accepts exactly one argument. Each variant /// stores argument type specific data. /// /// Note that clap supports more types of arguments than this, but we don't /// (and probably shouldn't) use them in ripgrep. /// /// Finally, note that we don't capture *all* state about an argument in this /// type. Some state is only known to clap. There isn't any particular reason /// why; the state we do capture is motivated by use cases (like generating /// documentation). #[derive(Clone)] pub enum RGArgKind { /// A positional argument. Positional { /// The name of the value used in the `-h/--help` output. By /// convention, this is an all-uppercase string. e.g., `PATH` or /// `PATTERN`. value_name: &'static str, /// Whether an argument can be repeated multiple times or not. /// /// The only argument this applies to is PATH, where an end user can /// specify multiple paths for ripgrep to search. /// /// If this is disabled, then an argument can only be provided once. /// For example, PATTERN is one such argument. (Note that the /// -e/--regexp flag is distinct from the positional PATTERN argument, /// and it can be provided multiple times.) multiple: bool, }, /// A boolean switch. Switch { /// The long name of a flag. This is always non-empty. long: &'static str, /// The short name of a flag. This is empty if a flag only has a long /// name. short: Option<&'static str>, /// Whether this switch can be provided multiple times where meaning /// is attached to the number of times this flag is given. /// /// Note that every switch can be provided multiple times. This /// particular state indicates whether all instances of a switch are /// relevant or not. /// /// For example, the -u/--unrestricted flag can be provided multiple /// times where each repeated use of it indicates more relaxing of /// ripgrep's filtering. Conversely, the -i/--ignore-case flag can /// also be provided multiple times, but it is simply considered either /// present or not. In these cases, -u/--unrestricted has `multiple` /// set to `true` while -i/--ignore-case has `multiple` set to `false`. multiple: bool, }, /// A flag the accepts a single value. Flag { /// The long name of a flag. This is always non-empty. long: &'static str, /// The short name of a flag. This is empty if a flag only has a long /// name. short: Option<&'static str>, /// The name of the value used in the `-h/--help` output. By /// convention, this is an all-uppercase string. e.g., `PATH` or /// `PATTERN`. value_name: &'static str, /// Whether this flag can be provided multiple times with multiple /// distinct values. /// /// Note that every flag can be provided multiple times. This /// particular state indicates whether all instances of a flag are /// relevant or not. /// /// For example, the -g/--glob flag can be provided multiple times and /// all of its values should be interpreted by ripgrep. Conversely, /// while the -C/--context flag can also be provided multiple times, /// only its last instance is used while all previous instances are /// ignored. In these cases, -g/--glob has `multiple` set to `true` /// while -C/--context has `multiple` set to `false`. multiple: bool, /// A set of possible values for this flag. If an end user provides /// any value other than what's in this set, then clap will report an /// error. possible_values: Vec<&'static str>, } } impl RGArg { /// Create a positional argument. /// /// The `long_name` parameter is the name of the argument, e.g., `pattern`. /// The `value_name` parameter is a name that describes the type of /// argument this flag accepts. It should be in uppercase, e.g., PATH or /// PATTERN. fn positional(name: &'static str, value_name: &'static str) -> RGArg { RGArg { claparg: Arg::with_name(name).value_name(value_name), name: name, doc_short: "", doc_long: "", hidden: false, kind: RGArgKind::Positional { value_name: value_name, multiple: false, }, } } /// Create a boolean switch. /// /// The `long_name` parameter is the name of the flag, e.g., `--long-name`. /// /// All switches may be repeated an arbitrary number of times. If a switch /// is truly boolean, that consumers of clap's configuration should only /// check whether the flag is present or not. Otherwise, consumers may /// inspect the number of times the switch is used. fn switch(long_name: &'static str) -> RGArg { let claparg = Arg::with_name(long_name) .long(long_name); RGArg { claparg: claparg, name: long_name, doc_short: "", doc_long: "", hidden: false, kind: RGArgKind::Switch { long: long_name, short: None, multiple: false, }, } } /// Create a flag. A flag always accepts exactly one argument. /// /// The `long_name` parameter is the name of the flag, e.g., `--long-name`. /// The `value_name` parameter is a name that describes the type of /// argument this flag accepts. It should be in uppercase, e.g., PATH or /// PATTERN. /// /// All flags may be repeated an arbitrary number of times. If a flag has /// only one logical value, that consumers of clap's configuration should /// only use the last value. fn flag(long_name: &'static str, value_name: &'static str) -> RGArg { let claparg = Arg::with_name(long_name) .long(long_name) .value_name(value_name) .takes_value(true) .number_of_values(1); RGArg { claparg: claparg, name: long_name, doc_short: "", doc_long: "", hidden: false, kind: RGArgKind::Flag { long: long_name, short: None, value_name: value_name, multiple: false, possible_values: vec![], } } } /// Set the short flag name. /// /// This panics if this arg isn't a switch or a flag. fn short(mut self, name: &'static str) -> RGArg { match self.kind { RGArgKind::Positional{..} => panic!("expected switch or flag"), RGArgKind::Switch { ref mut short, .. } => { *short = Some(name); } RGArgKind::Flag { ref mut short, .. } => { *short = Some(name); } } self.claparg = self.claparg.short(name); self } /// Set the "short" help text. /// /// This should be a single line. It is shown in the `-h` output. fn help(mut self, text: &'static str) -> RGArg { self.doc_short = text; self.claparg = self.claparg.help(text); self } /// Set the "long" help text. /// /// This should be at least a single line, usually longer. It is shown in /// the `--help` output. fn long_help(mut self, text: &'static str) -> RGArg { self.doc_long = text; self.claparg = self.claparg.long_help(text); self } /// Enable this argument to accept multiple values. /// /// Note that while switches and flags can always be repeated an arbitrary /// number of times, this particular method enables the flag to be /// logically repeated where each occurrence of the flag may have /// significance. That is, when this is disabled, then a switch is either /// present or not and a flag has exactly one value (the last one given). /// When this is enabled, then a switch has a count corresponding to the /// number of times it is used and a flag's value is a list of all values /// given. /// /// For the most part, this distinction is resolved by consumers of clap's /// configuration. fn multiple(mut self) -> RGArg { // Why not put `multiple` on RGArg proper? Because it's useful to // document it distinct for each different kind. See RGArgKind docs. match self.kind { RGArgKind::Positional { ref mut multiple, .. } => { *multiple = true; } RGArgKind::Switch { ref mut multiple, .. } => { *multiple = true; } RGArgKind::Flag { ref mut multiple, .. } => { *multiple = true; } } self.claparg = self.claparg.multiple(true); self } /// Hide this flag from all documentation. fn hidden(mut self) -> RGArg { self.hidden = true; self.claparg = self.claparg.hidden(true); self } /// Set the possible values for this argument. If this argument is not /// a flag, then this panics. /// /// If the end user provides any value other than what is given here, then /// clap will report an error to the user. /// /// Note that this will suppress clap's automatic output of possible values /// when using -h/--help, so users of this method should provide /// appropriate documentation for the choices in the "long" help text. fn possible_values(mut self, values: &[&'static str]) -> RGArg { match self.kind { RGArgKind::Positional{..} => panic!("expected flag"), RGArgKind::Switch{..} => panic!("expected flag"), RGArgKind::Flag { ref mut possible_values, .. } => { *possible_values = values.to_vec(); self.claparg = self.claparg .possible_values(values) .hide_possible_values(true); } } self } /// Add an alias to this argument. /// /// Aliases are not show in the output of -h/--help. fn alias(mut self, name: &'static str) -> RGArg { self.claparg = self.claparg.alias(name); self } /// Permit this flag to have values that begin with a hypen. /// /// This panics if this arg is not a flag. fn allow_leading_hyphen(mut self) -> RGArg { match self.kind { RGArgKind::Positional{..} => panic!("expected flag"), RGArgKind::Switch{..} => panic!("expected flag"), RGArgKind::Flag {..} => { self.claparg = self.claparg.allow_hyphen_values(true); } } self } /// Sets this argument to a required argument, unless one of the given /// arguments is provided. fn required_unless(mut self, names: &[&'static str]) -> RGArg { self.claparg = self.claparg.required_unless_one(names); self } /// Sets conflicting arguments. That is, if this argument is used whenever /// any of the other arguments given here are used, then clap will report /// an error. fn conflicts(mut self, names: &[&'static str]) -> RGArg { self.claparg = self.claparg.conflicts_with_all(names); self } /// Sets an overriding argument. That is, if this argument and the given /// argument are both provided by an end user, then the "last" one will /// win. ripgrep will behave as if any previous instantiations did not /// happen. fn overrides(mut self, name: &'static str) -> RGArg { self.claparg = self.claparg.overrides_with(name); self } /// Sets the default value of this argument if and only if the argument /// given is present. fn default_value_if( mut self, value: &'static str, arg_name: &'static str, ) -> RGArg { self.claparg = self.claparg.default_value_if(arg_name, None, value); self } /// Indicate that any value given to this argument should be a number. If /// it's not a number, then clap will report an error to the end user. fn number(mut self) -> RGArg { self.claparg = self.claparg.validator(|val| { val.parse::().map(|_| ()).map_err(|err| err.to_string()) }); self } } // We add an extra space to long descriptions so that a blank line is inserted // between flag descriptions in --help output. macro_rules! long { ($lit:expr) => { concat!($lit, " ") } } /// Generate a sequence of all positional and flag arguments. pub fn all_args_and_flags() -> Vec { let mut args = vec![]; // The positional arguments must be defined first and in order. arg_pattern(&mut args); arg_path(&mut args); // Flags can be defined in any order, but we do it alphabetically. Note // that each function may define multiple flags. For example, // `flag_encoding` defines `--encoding` and `--no-encoding`. Most `--no` // flags are hidden and merely mentioned in the docs of the corresponding // "positive" flag. flag_after_context(&mut args); flag_auto_hybrid_regex(&mut args); flag_before_context(&mut args); flag_binary(&mut args); flag_block_buffered(&mut args); flag_byte_offset(&mut args); flag_case_sensitive(&mut args); flag_color(&mut args); flag_colors(&mut args); flag_column(&mut args); flag_context(&mut args); flag_context_separator(&mut args); flag_count(&mut args); flag_count_matches(&mut args); flag_crlf(&mut args); flag_debug(&mut args); flag_dfa_size_limit(&mut args); flag_encoding(&mut args); flag_file(&mut args); flag_files(&mut args); flag_files_with_matches(&mut args); flag_files_without_match(&mut args); flag_fixed_strings(&mut args); flag_follow(&mut args); flag_glob(&mut args); flag_glob_case_insensitive(&mut args); flag_heading(&mut args); flag_hidden(&mut args); flag_iglob(&mut args); flag_ignore_case(&mut args); flag_ignore_file(&mut args); flag_ignore_file_case_insensitive(&mut args); flag_invert_match(&mut args); flag_json(&mut args); flag_line_buffered(&mut args); flag_line_number(&mut args); flag_line_regexp(&mut args); flag_max_columns(&mut args); flag_max_columns_preview(&mut args); flag_max_count(&mut args); flag_max_depth(&mut args); flag_max_filesize(&mut args); flag_mmap(&mut args); flag_multiline(&mut args); flag_multiline_dotall(&mut args); flag_no_config(&mut args); flag_no_ignore(&mut args); flag_no_ignore_dot(&mut args); flag_no_ignore_global(&mut args); flag_no_ignore_messages(&mut args); flag_no_ignore_parent(&mut args); flag_no_ignore_vcs(&mut args); flag_no_messages(&mut args); flag_no_pcre2_unicode(&mut args); flag_null(&mut args); flag_null_data(&mut args); flag_one_file_system(&mut args); flag_only_matching(&mut args); flag_path_separator(&mut args); flag_passthru(&mut args); flag_pcre2(&mut args); flag_pcre2_version(&mut args); flag_pre(&mut args); flag_pre_glob(&mut args); flag_pretty(&mut args); flag_quiet(&mut args); flag_regex_size_limit(&mut args); flag_regexp(&mut args); flag_replace(&mut args); flag_search_zip(&mut args); flag_smart_case(&mut args); flag_sort_files(&mut args); flag_sort(&mut args); flag_sortr(&mut args); flag_stats(&mut args); flag_text(&mut args); flag_threads(&mut args); flag_trim(&mut args); flag_type(&mut args); flag_type_add(&mut args); flag_type_clear(&mut args); flag_type_list(&mut args); flag_type_not(&mut args); flag_unrestricted(&mut args); flag_vimgrep(&mut args); flag_with_filename(&mut args); flag_word_regexp(&mut args); args } fn arg_pattern(args: &mut Vec) { const SHORT: &str = "A regular expression used for searching."; const LONG: &str = long!("\ A regular expression used for searching. To match a pattern beginning with a dash, use the -e/--regexp flag. For example, to search for the literal '-foo', you can use this flag: rg -e -foo You can also use the special '--' delimiter to indicate that no more flags will be provided. Namely, the following is equivalent to the above: rg -- -foo "); let arg = RGArg::positional("pattern", "PATTERN") .help(SHORT).long_help(LONG) .required_unless(&[ "file", "files", "regexp", "type-list", "pcre2-version", ]); args.push(arg); } fn arg_path(args: &mut Vec) { const SHORT: &str = "A file or directory to search."; const LONG: &str = long!("\ A file or directory to search. Directories are searched recursively. Paths \ specified on the command line override glob and ignore rules. \ "); let arg = RGArg::positional("path", "PATH") .help(SHORT).long_help(LONG) .multiple(); args.push(arg); } fn flag_after_context(args: &mut Vec) { const SHORT: &str = "Show NUM lines after each match."; const LONG: &str = long!("\ Show NUM lines after each match. This overrides the --context flag. "); let arg = RGArg::flag("after-context", "NUM").short("A") .help(SHORT).long_help(LONG) .number() .overrides("context"); args.push(arg); } fn flag_auto_hybrid_regex(args: &mut Vec) { const SHORT: &str = "Dynamically use PCRE2 if necessary."; const LONG: &str = long!("\ When this flag is used, ripgrep will dynamically choose between supported regex engines depending on the features used in a pattern. When ripgrep chooses a regex engine, it applies that choice for every regex provided to ripgrep (e.g., via multiple -e/--regexp or -f/--file flags). As an example of how this flag might behave, ripgrep will attempt to use its default finite automata based regex engine whenever the pattern can be successfully compiled with that regex engine. If PCRE2 is enabled and if the pattern given could not be compiled with the default regex engine, then PCRE2 will be automatically used for searching. If PCRE2 isn't available, then this flag has no effect because there is only one regex engine to choose from. In the future, ripgrep may adjust its heuristics for how it decides which regex engine to use. In general, the heuristics will be limited to a static analysis of the patterns, and not to any specific runtime behavior observed while searching files. The primary downside of using this flag is that it may not always be obvious which regex engine ripgrep uses, and thus, the match semantics or performance profile of ripgrep may subtly and unexpectedly change. However, in many cases, all regex engines will agree on what constitutes a match and it can be nice to transparently support more advanced regex features like look-around and backreferences without explicitly needing to enable them. This flag can be disabled with --no-auto-hybrid-regex. "); let arg = RGArg::switch("auto-hybrid-regex") .help(SHORT).long_help(LONG) .overrides("no-auto-hybrid-regex") .overrides("pcre2") .overrides("no-pcre2"); args.push(arg); let arg = RGArg::switch("no-auto-hybrid-regex") .hidden() .overrides("auto-hybrid-regex") .overrides("pcre2") .overrides("no-pcre2"); args.push(arg); } fn flag_before_context(args: &mut Vec) { const SHORT: &str = "Show NUM lines before each match."; const LONG: &str = long!("\ Show NUM lines before each match. This overrides the --context flag. "); let arg = RGArg::flag("before-context", "NUM").short("B") .help(SHORT).long_help(LONG) .number() .overrides("context"); args.push(arg); } fn flag_binary(args: &mut Vec) { const SHORT: &str = "Search binary files."; const LONG: &str = long!("\ Enabling this flag will cause ripgrep to search binary files. By default, ripgrep attempts to automatically skip binary files in order to improve the relevance of results and make the search faster. Binary files are heuristically detected based on whether they contain a NUL byte or not. By default (without this flag set), once a NUL byte is seen, ripgrep will stop searching the file. Usually, NUL bytes occur in the beginning of most binary files. If a NUL byte occurs after a match, then ripgrep will still stop searching the rest of the file, but a warning will be printed. In contrast, when this flag is provided, ripgrep will continue searching a file even if a NUL byte is found. In particular, if a NUL byte is found then ripgrep will continue searching until either a match is found or the end of the file is reached, whichever comes sooner. If a match is found, then ripgrep will stop and print a warning saying that the search stopped prematurely. If you want ripgrep to search a file without any special NUL byte handling at all (and potentially print binary data to stdout), then you should use the '-a/--text' flag. The '--binary' flag is a flag for controlling ripgrep's automatic filtering mechanism. As such, it does not need to be used when searching a file explicitly or when searching stdin. That is, it is only applicable when recursively searching a directory. Note that when the '-u/--unrestricted' flag is provided for a third time, then this flag is automatically enabled. This flag can be disabled with '--no-binary'. It overrides the '-a/--text' flag. "); let arg = RGArg::switch("binary") .help(SHORT).long_help(LONG) .overrides("no-binary") .overrides("text") .overrides("no-text"); args.push(arg); let arg = RGArg::switch("no-binary") .hidden() .overrides("binary") .overrides("text") .overrides("no-text"); args.push(arg); } fn flag_block_buffered(args: &mut Vec) { const SHORT: &str = "Force block buffering."; const LONG: &str = long!("\ When enabled, ripgrep will use block buffering. That is, whenever a matching line is found, it will be written to an in-memory buffer and will not be written to stdout until the buffer reaches a certain size. This is the default when ripgrep's stdout is redirected to a pipeline or a file. When ripgrep's stdout is connected to a terminal, line buffering will be used. Forcing block buffering can be useful when dumping a large amount of contents to a terminal. Forceful block buffering can be disabled with --no-block-buffered. Note that using --no-block-buffered causes ripgrep to revert to its default behavior of automatically detecting the buffering strategy. To force line buffering, use the --line-buffered flag. "); let arg = RGArg::switch("block-buffered") .help(SHORT).long_help(LONG) .overrides("no-block-buffered") .overrides("line-buffered") .overrides("no-line-buffered"); args.push(arg); let arg = RGArg::switch("no-block-buffered") .hidden() .overrides("block-buffered") .overrides("line-buffered") .overrides("no-line-buffered"); args.push(arg); } fn flag_byte_offset(args: &mut Vec) { const SHORT: &str = "Print the 0-based byte offset for each matching line."; const LONG: &str = long!("\ Print the 0-based byte offset within the input file before each line of output. If -o (--only-matching) is specified, print the offset of the matching part itself. If ripgrep does transcoding, then the byte offset is in terms of the the result of transcoding and not the original data. This applies similarly to another transformation on the source, such as decompression or a --pre filter. Note that when the PCRE2 regex engine is used, then UTF-8 transcoding is done by default. "); let arg = RGArg::switch("byte-offset").short("b") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_case_sensitive(args: &mut Vec) { const SHORT: &str = "Search case sensitively (default)."; const LONG: &str = long!("\ Search case sensitively. This overrides the -i/--ignore-case and -S/--smart-case flags. "); let arg = RGArg::switch("case-sensitive").short("s") .help(SHORT).long_help(LONG) .overrides("ignore-case") .overrides("smart-case"); args.push(arg); } fn flag_color(args: &mut Vec) { const SHORT: &str = "Controls when to use color."; const LONG: &str = long!("\ This flag controls when to use colors. The default setting is 'auto', which means ripgrep will try to guess when to use colors. For example, if ripgrep is printing to a terminal, then it will use colors, but if it is redirected to a file or a pipe, then it will suppress color output. ripgrep will suppress color output in some other circumstances as well. For example, if the TERM environment variable is not set or set to 'dumb', then ripgrep will not use colors. The possible values for this flag are: never Colors will never be used. auto The default. ripgrep tries to be smart. always Colors will always be used regardless of where output is sent. ansi Like 'always', but emits ANSI escapes (even in a Windows console). When the --vimgrep flag is given to ripgrep, then the default value for the --color flag changes to 'never'. "); let arg = RGArg::flag("color", "WHEN") .help(SHORT).long_help(LONG) .possible_values(&["never", "auto", "always", "ansi"]) .default_value_if("never", "vimgrep"); args.push(arg); } fn flag_colors(args: &mut Vec) { const SHORT: &str = "Configure color settings and styles."; const LONG: &str = long!("\ This flag specifies color settings for use in the output. This flag may be provided multiple times. Settings are applied iteratively. Colors are limited to one of eight choices: red, blue, green, cyan, magenta, yellow, white and black. Styles are limited to nobold, bold, nointense, intense, nounderline or underline. The format of the flag is '{type}:{attribute}:{value}'. '{type}' should be one of path, line, column or match. '{attribute}' can be fg, bg or style. '{value}' is either a color (for fg and bg) or a text style. A special format, '{type}:none', will clear all color settings for '{type}'. For example, the following command will change the match color to magenta and the background color for line numbers to yellow: rg --colors 'match:fg:magenta' --colors 'line:bg:yellow' foo. Extended colors can be used for '{value}' when the terminal supports ANSI color sequences. These are specified as either 'x' (256-color) or 'x,x,x' (24-bit truecolor) where x is a number between 0 and 255 inclusive. x may be given as a normal decimal number or a hexadecimal number, which is prefixed by `0x`. For example, the following command will change the match background color to that represented by the rgb value (0,128,255): rg --colors 'match:bg:0,128,255' or, equivalently, rg --colors 'match:bg:0x0,0x80,0xFF' Note that the the intense and nointense style flags will have no effect when used alongside these extended color codes. "); let arg = RGArg::flag("colors", "COLOR_SPEC") .help(SHORT).long_help(LONG) .multiple(); args.push(arg); } fn flag_column(args: &mut Vec) { const SHORT: &str = "Show column numbers."; const LONG: &str = long!("\ Show column numbers (1-based). This only shows the column numbers for the first match on each line. This does not try to account for Unicode. One byte is equal to one column. This implies --line-number. This flag can be disabled with --no-column. "); let arg = RGArg::switch("column") .help(SHORT).long_help(LONG) .overrides("no-column"); args.push(arg); let arg = RGArg::switch("no-column") .hidden() .overrides("column"); args.push(arg); } fn flag_context(args: &mut Vec) { const SHORT: &str = "Show NUM lines before and after each match."; const LONG: &str = long!("\ Show NUM lines before and after each match. This is equivalent to providing both the -B/--before-context and -A/--after-context flags with the same value. This overrides both the -B/--before-context and -A/--after-context flags. "); let arg = RGArg::flag("context", "NUM").short("C") .help(SHORT).long_help(LONG) .number() .overrides("before-context") .overrides("after-context"); args.push(arg); } fn flag_context_separator(args: &mut Vec) { const SHORT: &str = "Set the context separator string."; const LONG: &str = long!("\ The string used to separate non-contiguous context lines in the output. Escape sequences like \\x7F or \\t may be used. The default value is --. "); let arg = RGArg::flag("context-separator", "SEPARATOR") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_count(args: &mut Vec) { const SHORT: &str = "Only show the count of matching lines for each file."; const LONG: &str = long!("\ This flag suppresses normal output and shows the number of lines that match the given patterns for each file searched. Each file containing a match has its path and count printed on each line. Note that this reports the number of lines that match and not the total number of matches. If only one file is given to ripgrep, then only the count is printed if there is a match. The --with-filename flag can be used to force printing the file path in this case. This overrides the --count-matches flag. Note that when --count is combined with --only-matching, then ripgrep behaves as if --count-matches was given. "); let arg = RGArg::switch("count").short("c") .help(SHORT).long_help(LONG).overrides("count-matches"); args.push(arg); } fn flag_count_matches(args: &mut Vec) { const SHORT: &str = "Only show the count of individual matches for each file."; const LONG: &str = long!("\ This flag suppresses normal output and shows the number of individual matches of the given patterns for each file searched. Each file containing matches has its path and match count printed on each line. Note that this reports the total number of individual matches and not the number of lines that match. If only one file is given to ripgrep, then only the count is printed if there is a match. The --with-filename flag can be used to force printing the file path in this case. This overrides the --count flag. Note that when --count is combined with --only-matching, then ripgrep behaves as if --count-matches was given. "); let arg = RGArg::switch("count-matches") .help(SHORT).long_help(LONG).overrides("count"); args.push(arg); } fn flag_crlf(args: &mut Vec) { const SHORT: &str = "Support CRLF line terminators (useful on Windows)."; const LONG: &str = long!("\ When enabled, ripgrep will treat CRLF ('\\r\\n') as a line terminator instead of just '\\n'. Principally, this permits '$' in regex patterns to match just before CRLF instead of just before LF. The underlying regex engine may not support this natively, so ripgrep will translate all instances of '$' to '(?:\\r??$)'. This may produce slightly different than desired match offsets. It is intended as a work-around until the regex engine supports this natively. CRLF support can be disabled with --no-crlf. "); let arg = RGArg::switch("crlf") .help(SHORT).long_help(LONG) .overrides("no-crlf") .overrides("null-data"); args.push(arg); let arg = RGArg::switch("no-crlf") .hidden() .overrides("crlf"); args.push(arg); } fn flag_debug(args: &mut Vec) { const SHORT: &str = "Show debug messages."; const LONG: &str = long!("\ Show debug messages. Please use this when filing a bug report. The --debug flag is generally useful for figuring out why ripgrep skipped searching a particular file. The debug messages should mention all files skipped and why they were skipped. To get even more debug output, use the --trace flag, which implies --debug along with additional trace data. With --trace, the output could be quite large and is generally more useful for development. "); let arg = RGArg::switch("debug") .help(SHORT).long_help(LONG); args.push(arg); let arg = RGArg::switch("trace") .hidden() .overrides("debug"); args.push(arg); } fn flag_dfa_size_limit(args: &mut Vec) { const SHORT: &str = "The upper size limit of the regex DFA."; const LONG: &str = long!("\ The upper size limit of the regex DFA. The default limit is 10M. This should only be changed on very large regex inputs where the (slower) fallback regex engine may otherwise be used if the limit is reached. The argument accepts the same size suffixes as allowed in with the --max-filesize flag. "); let arg = RGArg::flag("dfa-size-limit", "NUM+SUFFIX?") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_encoding(args: &mut Vec) { const SHORT: &str = "Specify the text encoding of files to search."; const LONG: &str = long!("\ Specify the text encoding that ripgrep will use on all files searched. The default value is 'auto', which will cause ripgrep to do a best effort automatic detection of encoding on a per-file basis. Automatic detection in this case only applies to files that begin with a UTF-8 or UTF-16 byte-order mark (BOM). No other automatic detection is performed. One can also specify 'none' which will then completely disable BOM sniffing and always result in searching the raw bytes, including a BOM if it's present, regardless of its encoding. Other supported values can be found in the list of labels here: https://encoding.spec.whatwg.org/#concept-encoding-get For more details on encoding and how ripgrep deals with it, see GUIDE.md. This flag can be disabled with --no-encoding. "); let arg = RGArg::flag("encoding", "ENCODING").short("E") .help(SHORT).long_help(LONG); args.push(arg); let arg = RGArg::switch("no-encoding") .hidden() .overrides("encoding"); args.push(arg); } fn flag_file(args: &mut Vec) { const SHORT: &str = "Search for patterns from the given file."; const LONG: &str = long!("\ Search for patterns from the given file, with one pattern per line. When this flag is used multiple times or in combination with the -e/--regexp flag, then all patterns provided are searched. Empty pattern lines will match all input lines, and the newline is not counted as part of the pattern. A line is printed if and only if it matches at least one of the patterns. "); let arg = RGArg::flag("file", "PATTERNFILE").short("f") .help(SHORT).long_help(LONG) .multiple() .allow_leading_hyphen(); args.push(arg); } fn flag_files(args: &mut Vec) { const SHORT: &str = "Print each file that would be searched."; const LONG: &str = long!("\ Print each file that would be searched without actually performing the search. This is useful to determine whether a particular file is being searched or not. "); let arg = RGArg::switch("files") .help(SHORT).long_help(LONG) // This also technically conflicts with pattern, but the first file // path will actually be in pattern. .conflicts(&["file", "regexp", "type-list"]); args.push(arg); } fn flag_files_with_matches(args: &mut Vec) { const SHORT: &str = "Only print the paths with at least one match."; const LONG: &str = long!("\ Only print the paths with at least one match. This overrides --files-without-match. "); let arg = RGArg::switch("files-with-matches").short("l") .help(SHORT).long_help(LONG) .overrides("files-without-match"); args.push(arg); } fn flag_files_without_match(args: &mut Vec) { const SHORT: &str = "Only print the paths that contain zero matches."; const LONG: &str = long!("\ Only print the paths that contain zero matches. This inverts/negates the --files-with-matches flag. This overrides --files-with-matches. "); let arg = RGArg::switch("files-without-match") .help(SHORT).long_help(LONG) .overrides("files-with-matches"); args.push(arg); } fn flag_fixed_strings(args: &mut Vec) { const SHORT: &str = "Treat the pattern as a literal string."; const LONG: &str = long!("\ Treat the pattern as a literal string instead of a regular expression. When this flag is used, special regular expression meta characters such as .(){}*+ do not need to be escaped. This flag can be disabled with --no-fixed-strings. "); let arg = RGArg::switch("fixed-strings").short("F") .help(SHORT).long_help(LONG) .overrides("no-fixed-strings"); args.push(arg); let arg = RGArg::switch("no-fixed-strings") .hidden() .overrides("fixed-strings"); args.push(arg); } fn flag_follow(args: &mut Vec) { const SHORT: &str = "Follow symbolic links."; const LONG: &str = long!("\ When this flag is enabled, ripgrep will follow symbolic links while traversing directories. This is disabled by default. Note that ripgrep will check for symbolic link loops and report errors if it finds one. This flag can be disabled with --no-follow. "); let arg = RGArg::switch("follow").short("L") .help(SHORT).long_help(LONG) .overrides("no-follow"); args.push(arg); let arg = RGArg::switch("no-follow") .hidden() .overrides("follow"); args.push(arg); } fn flag_glob(args: &mut Vec) { const SHORT: &str = "Include or exclude files."; const LONG: &str = long!("\ Include or exclude files and directories for searching that match the given glob. This always overrides any other ignore logic. Multiple glob flags may be used. Globbing rules match .gitignore globs. Precede a glob with a ! to exclude it. "); let arg = RGArg::flag("glob", "GLOB").short("g") .help(SHORT).long_help(LONG) .multiple() .allow_leading_hyphen(); args.push(arg); } fn flag_glob_case_insensitive(args: &mut Vec) { const SHORT: &str = "Process all glob patterns case insensitively."; const LONG: &str = long!("\ Process glob patterns given with the -g/--glob flag case insensitively. This effectively treats --glob as --iglob. This flag can be disabled with the --no-glob-case-insensitive flag. "); let arg = RGArg::switch("glob-case-insensitive") .help(SHORT).long_help(LONG) .overrides("no-glob-case-insensitive"); args.push(arg); let arg = RGArg::switch("no-glob-case-insensitive") .hidden() .overrides("glob-case-insensitive"); args.push(arg); } fn flag_heading(args: &mut Vec) { const SHORT: &str = "Print matches grouped by each file."; const LONG: &str = long!("\ This flag prints the file path above clusters of matches from each file instead of printing the file path as a prefix for each matched line. This is the default mode when printing to a terminal. This overrides the --no-heading flag. "); let arg = RGArg::switch("heading") .help(SHORT).long_help(LONG) .overrides("no-heading"); args.push(arg); const NO_SHORT: &str = "Don't group matches by each file."; const NO_LONG: &str = long!("\ Don't group matches by each file. If --no-heading is provided in addition to the -H/--with-filename flag, then file paths will be printed as a prefix for every matched line. This is the default mode when not printing to a terminal. This overrides the --heading flag. "); let arg = RGArg::switch("no-heading") .help(NO_SHORT).long_help(NO_LONG) .overrides("heading"); args.push(arg); } fn flag_hidden(args: &mut Vec) { const SHORT: &str = "Search hidden files and directories."; const LONG: &str = long!("\ Search hidden files and directories. By default, hidden files and directories are skipped. Note that if a hidden file or a directory is whitelisted in an ignore file, then it will be searched even if this flag isn't provided. This flag can be disabled with --no-hidden. "); let arg = RGArg::switch("hidden") .help(SHORT).long_help(LONG) .overrides("no-hidden"); args.push(arg); let arg = RGArg::switch("no-hidden") .hidden() .overrides("hidden"); args.push(arg); } fn flag_iglob(args: &mut Vec) { const SHORT: &str = "Include or exclude files case insensitively."; const LONG: &str = long!("\ Include or exclude files and directories for searching that match the given glob. This always overrides any other ignore logic. Multiple glob flags may be used. Globbing rules match .gitignore globs. Precede a glob with a ! to exclude it. Globs are matched case insensitively. "); let arg = RGArg::flag("iglob", "GLOB") .help(SHORT).long_help(LONG) .multiple() .allow_leading_hyphen(); args.push(arg); } fn flag_ignore_case(args: &mut Vec) { const SHORT: &str = "Case insensitive search."; const LONG: &str = long!("\ When this flag is provided, the given patterns will be searched case insensitively. The case insensitivity rules used by ripgrep conform to Unicode's \"simple\" case folding rules. This flag overrides -s/--case-sensitive and -S/--smart-case. "); let arg = RGArg::switch("ignore-case").short("i") .help(SHORT).long_help(LONG) .overrides("case-sensitive") .overrides("smart-case"); args.push(arg); } fn flag_ignore_file(args: &mut Vec) { const SHORT: &str = "Specify additional ignore files."; const LONG: &str = long!("\ Specifies a path to one or more .gitignore format rules files. These patterns are applied after the patterns found in .gitignore and .ignore are applied and are matched relative to the current working directory. Multiple additional ignore files can be specified by using the --ignore-file flag several times. When specifying multiple ignore files, earlier files have lower precedence than later files. If you are looking for a way to include or exclude files and directories directly on the command line, then used -g instead. "); let arg = RGArg::flag("ignore-file", "PATH") .help(SHORT).long_help(LONG) .multiple() .allow_leading_hyphen(); args.push(arg); } fn flag_ignore_file_case_insensitive(args: &mut Vec) { const SHORT: &str = "Process ignore files case insensitively."; const LONG: &str = long!("\ Process ignore files (.gitignore, .ignore, etc.) case insensitively. Note that this comes with a performance penalty and is most useful on case insensitive file systems (such as Windows). This flag can be disabled with the --no-ignore-file-case-insensitive flag. "); let arg = RGArg::switch("ignore-file-case-insensitive") .help(SHORT).long_help(LONG) .overrides("no-ignore-file-case-insensitive"); args.push(arg); let arg = RGArg::switch("no-ignore-file-case-insensitive") .hidden() .overrides("ignore-file-case-insensitive"); args.push(arg); } fn flag_invert_match(args: &mut Vec) { const SHORT: &str = "Invert matching."; const LONG: &str = long!("\ Invert matching. Show lines that do not match the given patterns. "); let arg = RGArg::switch("invert-match").short("v") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_json(args: &mut Vec) { const SHORT: &str = "Show search results in a JSON Lines format."; const LONG: &str = long!("\ Enable printing results in a JSON Lines format. When this flag is provided, ripgrep will emit a sequence of messages, each encoded as a JSON object, where there are five different message types: **begin** - A message that indicates a file is being searched and contains at least one match. **end** - A message the indicates a file is done being searched. This message also include summary statistics about the search for a particular file. **match** - A message that indicates a match was found. This includes the text and offsets of the match. **context** - A message that indicates a contextual line was found. This includes the text of the line, along with any match information if the search was inverted. **summary** - The final message emitted by ripgrep that contains summary statistics about the search across all files. Since file paths or the contents of files are not guaranteed to be valid UTF-8 and JSON itself must be representable by a Unicode encoding, ripgrep will emit all data elements as objects with one of two keys: 'text' or 'bytes'. 'text' is a normal JSON string when the data is valid UTF-8 while 'bytes' is the base64 encoded contents of the data. The JSON Lines format is only supported for showing search results. It cannot be used with other flags that emit other types of output, such as --files, --files-with-matches, --files-without-match, --count or --count-matches. ripgrep will report an error if any of the aforementioned flags are used in concert with --json. Other flags that control aspects of the standard output such as --only-matching, --heading, --replace, --max-columns, etc., have no effect when --json is set. A more complete description of the JSON format used can be found here: https://docs.rs/grep-printer/*/grep_printer/struct.JSON.html The JSON Lines format can be disabled with --no-json. "); let arg = RGArg::switch("json") .help(SHORT).long_help(LONG) .overrides("no-json") .conflicts(&[ "count", "count-matches", "files", "files-with-matches", "files-without-match", ]); args.push(arg); let arg = RGArg::switch("no-json") .hidden() .overrides("json"); args.push(arg); } fn flag_line_buffered(args: &mut Vec) { const SHORT: &str = "Force line buffering."; const LONG: &str = long!("\ When enabled, ripgrep will use line buffering. That is, whenever a matching line is found, it will be flushed to stdout immediately. This is the default when ripgrep's stdout is connected to a terminal, but otherwise, ripgrep will use block buffering, which is typically faster. This flag forces ripgrep to use line buffering even if it would otherwise use block buffering. This is typically useful in shell pipelines, e.g., 'tail -f something.log | rg foo --line-buffered | rg bar'. Forceful line buffering can be disabled with --no-line-buffered. Note that using --no-line-buffered causes ripgrep to revert to its default behavior of automatically detecting the buffering strategy. To force block buffering, use the --block-buffered flag. "); let arg = RGArg::switch("line-buffered") .help(SHORT).long_help(LONG) .overrides("no-line-buffered") .overrides("block-buffered") .overrides("no-block-buffered"); args.push(arg); let arg = RGArg::switch("no-line-buffered") .hidden() .overrides("line-buffered") .overrides("block-buffered") .overrides("no-block-buffered"); args.push(arg); } fn flag_line_number(args: &mut Vec) { const SHORT: &str = "Show line numbers."; const LONG: &str = long!("\ Show line numbers (1-based). This is enabled by default when searching in a terminal. "); let arg = RGArg::switch("line-number").short("n") .help(SHORT).long_help(LONG) .overrides("no-line-number"); args.push(arg); const NO_SHORT: &str = "Suppress line numbers."; const NO_LONG: &str = long!("\ Suppress line numbers. This is enabled by default when not searching in a terminal. "); let arg = RGArg::switch("no-line-number").short("N") .help(NO_SHORT).long_help(NO_LONG) .overrides("line-number"); args.push(arg); } fn flag_line_regexp(args: &mut Vec) { const SHORT: &str = "Only show matches surrounded by line boundaries."; const LONG: &str = long!("\ Only show matches surrounded by line boundaries. This is equivalent to putting ^...$ around all of the search patterns. In other words, this only prints lines where the entire line participates in a match. This overrides the --word-regexp flag. "); let arg = RGArg::switch("line-regexp").short("x") .help(SHORT).long_help(LONG) .overrides("word-regexp"); args.push(arg); } fn flag_max_columns(args: &mut Vec) { const SHORT: &str = "Don't print lines longer than this limit."; const LONG: &str = long!("\ Don't print lines longer than this limit in bytes. Longer lines are omitted, and only the number of matches in that line is printed. When this flag is omitted or is set to 0, then it has no effect. "); let arg = RGArg::flag("max-columns", "NUM").short("M") .help(SHORT).long_help(LONG) .number(); args.push(arg); } fn flag_max_columns_preview(args: &mut Vec) { const SHORT: &str = "Print a preview for lines exceeding the limit."; const LONG: &str = long!("\ When the '--max-columns' flag is used, ripgrep will by default completely replace any line that is too long with a message indicating that a matching line was removed. When this flag is combined with '--max-columns', a preview of the line (corresponding to the limit size) is shown instead, where the part of the line exceeding the limit is not shown. If the '--max-columns' flag is not set, then this has no effect. This flag can be disabled with '--no-max-columns-preview'. "); let arg = RGArg::switch("max-columns-preview") .help(SHORT).long_help(LONG) .overrides("no-max-columns-preview"); args.push(arg); let arg = RGArg::switch("no-max-columns-preview") .hidden() .overrides("max-columns-preview"); args.push(arg); } fn flag_max_count(args: &mut Vec) { const SHORT: &str = "Limit the number of matches."; const LONG: &str = long!("\ Limit the number of matching lines per file searched to NUM. "); let arg = RGArg::flag("max-count", "NUM").short("m") .help(SHORT).long_help(LONG) .number(); args.push(arg); } fn flag_max_depth(args: &mut Vec) { const SHORT: &str = "Descend at most NUM directories."; const LONG: &str = long!("\ Limit the depth of directory traversal to NUM levels beyond the paths given. A value of zero only searches the explicitly given paths themselves. For example, 'rg --max-depth 0 dir/' is a no-op because dir/ will not be descended into. 'rg --max-depth 1 dir/' will search only the direct children of 'dir'. "); let arg = RGArg::flag("max-depth", "NUM") .help(SHORT).long_help(LONG) .alias("maxdepth") .number(); args.push(arg); } fn flag_max_filesize(args: &mut Vec) { const SHORT: &str = "Ignore files larger than NUM in size."; const LONG: &str = long!("\ Ignore files larger than NUM in size. This does not apply to directories. The input format accepts suffixes of K, M or G which correspond to kilobytes, megabytes and gigabytes, respectively. If no suffix is provided the input is treated as bytes. Examples: --max-filesize 50K or --max-filesize 80M "); let arg = RGArg::flag("max-filesize", "NUM+SUFFIX?") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_mmap(args: &mut Vec) { const SHORT: &str = "Search using memory maps when possible."; const LONG: &str = long!("\ Search using memory maps when possible. This is enabled by default when ripgrep thinks it will be faster. Memory map searching doesn't currently support all options, so if an incompatible option (e.g., --context) is given with --mmap, then memory maps will not be used. Note that ripgrep may abort unexpectedly when --mmap if it searches a file that is simultaneously truncated. This flag overrides --no-mmap. "); let arg = RGArg::switch("mmap") .help(SHORT).long_help(LONG) .overrides("no-mmap"); args.push(arg); const NO_SHORT: &str = "Never use memory maps."; const NO_LONG: &str = long!("\ Never use memory maps, even when they might be faster. This flag overrides --mmap. "); let arg = RGArg::switch("no-mmap") .help(NO_SHORT).long_help(NO_LONG) .overrides("mmap"); args.push(arg); } fn flag_multiline(args: &mut Vec) { const SHORT: &str = "Enable matching across multiple lines."; const LONG: &str = long!("\ Enable matching across multiple lines. When multiline mode is enabled, ripgrep will lift the restriction that a match cannot include a line terminator. For example, when multiline mode is not enabled (the default), then the regex '\\p{any}' will match any Unicode codepoint other than '\\n'. Similarly, the regex '\\n' is explicitly forbidden, and if you try to use it, ripgrep will return an error. However, when multiline mode is enabled, '\\p{any}' will match any Unicode codepoint, including '\\n', and regexes like '\\n' are permitted. An important caveat is that multiline mode does not change the match semantics of '.'. Namely, in most regex matchers, a '.' will by default match any character other than '\\n', and this is true in ripgrep as well. In order to make '.' match '\\n', you must enable the \"dot all\" flag inside the regex. For example, both '(?s).' and '(?s:.)' have the same semantics, where '.' will match any character, including '\\n'. Alternatively, the '--multiline-dotall' flag may be passed to make the \"dot all\" behavior the default. This flag only applies when multiline search is enabled. There is no limit on the number of the lines that a single match can span. **WARNING**: Because of how the underlying regex engine works, multiline searches may be slower than normal line-oriented searches, and they may also use more memory. In particular, when multiline mode is enabled, ripgrep requires that each file it searches is laid out contiguously in memory (either by reading it onto the heap or by memory-mapping it). Things that cannot be memory-mapped (such as stdin) will be consumed until EOF before searching can begin. In general, ripgrep will only do these things when necessary. Specifically, if the --multiline flag is provided but the regex does not contain patterns that would match '\\n' characters, then ripgrep will automatically avoid reading each file into memory before searching it. Nevertheless, if you only care about matches spanning at most one line, then it is always better to disable multiline mode. This flag can be disabled with --no-multiline. "); let arg = RGArg::switch("multiline").short("U") .help(SHORT).long_help(LONG) .overrides("no-multiline"); args.push(arg); let arg = RGArg::switch("no-multiline") .hidden() .overrides("multiline"); args.push(arg); } fn flag_multiline_dotall(args: &mut Vec) { const SHORT: &str = "Make '.' match new lines when multiline is enabled."; const LONG: &str = long!("\ This flag enables \"dot all\" in your regex pattern, which causes '.' to match newlines when multiline searching is enabled. This flag has no effect if multiline searching isn't enabled with the --multiline flag. Normally, a '.' will match any character except newlines. While this behavior typically isn't relevant for line-oriented matching (since matches can span at most one line), this can be useful when searching with the -U/--multiline flag. By default, the multiline mode runs without this flag. This flag is generally intended to be used in an alias or your ripgrep config file if you prefer \"dot all\" semantics by default. Note that regardless of whether this flag is used, \"dot all\" semantics can still be controlled via inline flags in the regex pattern itself, e.g., '(?s:.)' always enables \"dot all\" whereas '(?-s:.)' always disables \"dot all\". This flag can be disabled with --no-multiline-dotall. "); let arg = RGArg::switch("multiline-dotall") .help(SHORT).long_help(LONG) .overrides("no-multiline-dotall"); args.push(arg); let arg = RGArg::switch("no-multiline-dotall") .hidden() .overrides("multiline-dotall"); args.push(arg); } fn flag_no_config(args: &mut Vec) { const SHORT: &str = "Never read configuration files."; const LONG: &str = long!("\ Never read configuration files. When this flag is present, ripgrep will not respect the RIPGREP_CONFIG_PATH environment variable. If ripgrep ever grows a feature to automatically read configuration files in pre-defined locations, then this flag will also disable that behavior as well. "); let arg = RGArg::switch("no-config") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_no_ignore(args: &mut Vec) { const SHORT: &str = "Don't respect ignore files."; const LONG: &str = long!("\ Don't respect ignore files (.gitignore, .ignore, etc.). This implies --no-ignore-parent, --no-ignore-dot and --no-ignore-vcs. This flag can be disabled with the --ignore flag. "); let arg = RGArg::switch("no-ignore") .help(SHORT).long_help(LONG) .overrides("ignore"); args.push(arg); let arg = RGArg::switch("ignore") .hidden() .overrides("no-ignore"); args.push(arg); } fn flag_no_ignore_dot(args: &mut Vec) { const SHORT: &str = "Don't respect .ignore files."; const LONG: &str = long!("\ Don't respect .ignore files. This flag can be disabled with the --ignore-dot flag. "); let arg = RGArg::switch("no-ignore-dot") .help(SHORT).long_help(LONG) .overrides("ignore-dot"); args.push(arg); let arg = RGArg::switch("ignore-dot") .hidden() .overrides("no-ignore-dot"); args.push(arg); } fn flag_no_ignore_global(args: &mut Vec) { const SHORT: &str = "Don't respect global ignore files."; const LONG: &str = long!("\ Don't respect ignore files that come from \"global\" sources such as git's `core.excludesFile` configuration option (which defaults to `$HOME/.config/git/ignore`). This flag can be disabled with the --ignore-global flag. "); let arg = RGArg::switch("no-ignore-global") .help(SHORT).long_help(LONG) .overrides("ignore-global"); args.push(arg); let arg = RGArg::switch("ignore-global") .hidden() .overrides("no-ignore-global"); args.push(arg); } fn flag_no_ignore_messages(args: &mut Vec) { const SHORT: &str = "Suppress gitignore parse error messages."; const LONG: &str = long!("\ Suppresses all error messages related to parsing ignore files such as .ignore or .gitignore. This flag can be disabled with the --ignore-messages flag. "); let arg = RGArg::switch("no-ignore-messages") .help(SHORT).long_help(LONG) .overrides("ignore-messages"); args.push(arg); let arg = RGArg::switch("ignore-messages") .hidden() .overrides("no-ignore-messages"); args.push(arg); } fn flag_no_ignore_parent(args: &mut Vec) { const SHORT: &str = "Don't respect ignore files in parent directories."; const LONG: &str = long!("\ Don't respect ignore files (.gitignore, .ignore, etc.) in parent directories. This flag can be disabled with the --ignore-parent flag. "); let arg = RGArg::switch("no-ignore-parent") .help(SHORT).long_help(LONG) .overrides("ignore-parent"); args.push(arg); let arg = RGArg::switch("ignore-parent") .hidden() .overrides("no-ignore-parent"); args.push(arg); } fn flag_no_ignore_vcs(args: &mut Vec) { const SHORT: &str = "Don't respect VCS ignore files."; const LONG: &str = long!("\ Don't respect version control ignore files (.gitignore, etc.). This implies --no-ignore-parent for VCS files. Note that .ignore files will continue to be respected. This flag can be disabled with the --ignore-vcs flag. "); let arg = RGArg::switch("no-ignore-vcs") .help(SHORT).long_help(LONG) .overrides("ignore-vcs"); args.push(arg); let arg = RGArg::switch("ignore-vcs") .hidden() .overrides("no-ignore-vcs"); args.push(arg); } fn flag_no_messages(args: &mut Vec) { const SHORT: &str = "Suppress some error messages."; const LONG: &str = long!("\ Suppress all error messages related to opening and reading files. Error messages related to the syntax of the pattern given are still shown. This flag can be disabled with the --messages flag. "); let arg = RGArg::switch("no-messages") .help(SHORT).long_help(LONG) .overrides("messages"); args.push(arg); let arg = RGArg::switch("messages") .hidden() .overrides("no-messages"); args.push(arg); } fn flag_no_pcre2_unicode(args: &mut Vec) { const SHORT: &str = "Disable Unicode mode for PCRE2 matching."; const LONG: &str = long!("\ When PCRE2 matching is enabled, this flag will disable Unicode mode, which is otherwise enabled by default. If PCRE2 matching is not enabled, then this flag has no effect. When PCRE2's Unicode mode is enabled, several different types of patterns become Unicode aware. This includes '\\b', '\\B', '\\w', '\\W', '\\d', '\\D', '\\s' and '\\S'. Similarly, the '.' meta character will match any Unicode codepoint instead of any byte. Caseless matching will also use Unicode simple case folding instead of ASCII-only case insensitivity. Unicode mode in PCRE2 represents a critical trade off in the user experience of ripgrep. In particular, unlike the default regex engine, PCRE2 does not support the ability to search possibly invalid UTF-8 with Unicode features enabled. Instead, PCRE2 *requires* that everything it searches when Unicode mode is enabled is valid UTF-8. (Or valid UTF-16/UTF-32, but for the purposes of ripgrep, we only discuss UTF-8.) This means that if you have PCRE2's Unicode mode enabled and you attempt to search invalid UTF-8, then the search for that file will halt and print an error. For this reason, when PCRE2's Unicode mode is enabled, ripgrep will automatically \"fix\" invalid UTF-8 sequences by replacing them with the Unicode replacement codepoint. If you would rather see the encoding errors surfaced by PCRE2 when Unicode mode is enabled, then pass the --no-encoding flag to disable all transcoding. Related flags: --pcre2 This flag can be disabled with --pcre2-unicode. "); let arg = RGArg::switch("no-pcre2-unicode") .help(SHORT).long_help(LONG) .overrides("pcre2-unicode"); args.push(arg); let arg = RGArg::switch("pcre2-unicode") .hidden() .overrides("no-pcre2-unicode"); args.push(arg); } fn flag_null(args: &mut Vec) { const SHORT: &str = "Print a NUL byte after file paths."; const LONG: &str = long!("\ Whenever a file path is printed, follow it with a NUL byte. This includes printing file paths before matches, and when printing a list of matching files such as with --count, --files-with-matches and --files. This option is useful for use with xargs. "); let arg = RGArg::switch("null").short("0") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_null_data(args: &mut Vec) { const SHORT: &str = "Use NUL as a line terminator instead of \\n."; const LONG: &str = long!("\ Enabling this option causes ripgrep to use NUL as a line terminator instead of the default of '\\n'. This is useful when searching large binary files that would otherwise have very long lines if '\\n' were used as the line terminator. In particular, ripgrep requires that, at a minimum, each line must fit into memory. Using NUL instead can be a useful stopgap to keep memory requirements low and avoid OOM (out of memory) conditions. This is also useful for processing NUL delimited data, such as that emitted when using ripgrep's -0/--null flag or find's --print0 flag. Using this flag implies -a/--text. "); let arg = RGArg::switch("null-data") .help(SHORT).long_help(LONG) .overrides("crlf"); args.push(arg); } fn flag_one_file_system(args: &mut Vec) { const SHORT: &str = "Do not descend into directories on other file systems."; const LONG: &str = long!("\ When enabled, ripgrep will not cross file system boundaries relative to where the search started from. Note that this applies to each path argument given to ripgrep. For example, in the command 'rg --one-file-system /foo/bar /quux/baz', ripgrep will search both '/foo/bar' and '/quux/baz' even if they are on different file systems, but will not cross a file system boundary when traversing each path's directory tree. This is similar to find's '-xdev' or '-mount' flag. This flag can be disabled with --no-one-file-system. "); let arg = RGArg::switch("one-file-system") .help(SHORT).long_help(LONG) .overrides("no-one-file-system"); args.push(arg); let arg = RGArg::switch("no-one-file-system") .hidden() .overrides("one-file-system"); args.push(arg); } fn flag_only_matching(args: &mut Vec) { const SHORT: &str = "Print only matches parts of a line."; const LONG: &str = long!("\ Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. "); let arg = RGArg::switch("only-matching").short("o") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_path_separator(args: &mut Vec) { const SHORT: &str = "Set the path separator."; const LONG: &str = long!("\ Set the path separator to use when printing file paths. This defaults to your platform's path separator, which is / on Unix and \\ on Windows. This flag is intended for overriding the default when the environment demands it (e.g., cygwin). A path separator is limited to a single byte. "); let arg = RGArg::flag("path-separator", "SEPARATOR") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_passthru(args: &mut Vec) { const SHORT: &str = "Print both matching and non-matching lines."; const LONG: &str = long!("\ Print both matching and non-matching lines. Another way to achieve a similar effect is by modifying your pattern to match the empty string. For example, if you are searching using 'rg foo' then using 'rg \"^|foo\"' instead will emit every line in every file searched, but only occurrences of 'foo' will be highlighted. This flag enables the same behavior without needing to modify the pattern. "); let arg = RGArg::switch("passthru") .help(SHORT).long_help(LONG) .alias("passthrough"); args.push(arg); } fn flag_pcre2(args: &mut Vec) { const SHORT: &str = "Enable PCRE2 matching."; const LONG: &str = long!("\ When this flag is present, ripgrep will use the PCRE2 regex engine instead of its default regex engine. This is generally useful when you want to use features such as look-around or backreferences. Note that PCRE2 is an optional ripgrep feature. If PCRE2 wasn't included in your build of ripgrep, then using this flag will result in ripgrep printing an error message and exiting. PCRE2 may also have worse user experience in some cases, since it has fewer introspection APIs than ripgrep's default regex engine. For example, if you use a '\n' in a PCRE2 regex without the '-U/--multiline' flag, then ripgrep will silently fail to match anything instead of reporting an error immediately (like it does with the default regex engine). Related flags: --no-pcre2-unicode This flag can be disabled with --no-pcre2. "); let arg = RGArg::switch("pcre2").short("P") .help(SHORT).long_help(LONG) .overrides("no-pcre2") .overrides("auto-hybrid-regex") .overrides("no-auto-hybrid-regex"); args.push(arg); let arg = RGArg::switch("no-pcre2") .hidden() .overrides("pcre2") .overrides("auto-hybrid-regex") .overrides("no-auto-hybrid-regex"); args.push(arg); } fn flag_pcre2_version(args: &mut Vec) { const SHORT: &str = "Print the version of PCRE2 that ripgrep uses."; const LONG: &str = long!("\ When this flag is present, ripgrep will print the version of PCRE2 in use, along with other information, and then exit. If PCRE2 is not available, then ripgrep will print an error message and exit with an error code. "); let arg = RGArg::switch("pcre2-version") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_pre(args: &mut Vec) { const SHORT: &str = "search outputs of COMMAND FILE for each FILE"; const LONG: &str = long!("\ For each input FILE, search the standard output of COMMAND FILE rather than the contents of FILE. This option expects the COMMAND program to either be an absolute path or to be available in your PATH. Either an empty string COMMAND or the '--no-pre' flag will disable this behavior. WARNING: When this flag is set, ripgrep will unconditionally spawn a process for every file that is searched. Therefore, this can incur an unnecessarily large performance penalty if you don't otherwise need the flexibility offered by this flag. One possible mitigation to this is to use the '--pre-glob' flag to limit which files a preprocessor is run with. A preprocessor is not run when ripgrep is searching stdin. When searching over sets of files that may require one of several decoders as preprocessors, COMMAND should be a wrapper program or script which first classifies FILE based on magic numbers/content or based on the FILE name and then dispatches to an appropriate preprocessor. Each COMMAND also has its standard input connected to FILE for convenience. For example, a shell script for COMMAND might look like: case \"$1\" in *.pdf) exec pdftotext \"$1\" - ;; *) case $(file \"$1\") in *Zstandard*) exec pzstd -cdq ;; *) exec cat ;; esac ;; esac The above script uses `pdftotext` to convert a PDF file to plain text. For all other files, the script uses the `file` utility to sniff the type of the file based on its contents. If it is a compressed file in the Zstandard format, then `pzstd` is used to decompress the contents to stdout. This overrides the -z/--search-zip flag. "); let arg = RGArg::flag("pre", "COMMAND") .help(SHORT).long_help(LONG) .overrides("no-pre") .overrides("search-zip"); args.push(arg); let arg = RGArg::switch("no-pre") .hidden() .overrides("pre"); args.push(arg); } fn flag_pre_glob(args: &mut Vec) { const SHORT: &str = "Include or exclude files from a preprocessing command."; const LONG: &str = long!("\ This flag works in conjunction with the --pre flag. Namely, when one or more --pre-glob flags are given, then only files that match the given set of globs will be handed to the command specified by the --pre flag. Any non-matching files will be searched without using the preprocessor command. This flag is useful when searching many files with the --pre flag. Namely, it permits the ability to avoid process overhead for files that don't need preprocessing. For example, given the following shell script, 'pre-pdftotext': #!/bin/sh pdftotext \"$1\" - then it is possible to use '--pre pre-pdftotext --pre-glob \'*.pdf\'' to make it so ripgrep only executes the 'pre-pdftotext' command on files with a '.pdf' extension. Multiple --pre-glob flags may be used. Globbing rules match .gitignore globs. Precede a glob with a ! to exclude it. This flag has no effect if the --pre flag is not used. "); let arg = RGArg::flag("pre-glob", "GLOB") .help(SHORT).long_help(LONG) .multiple() .allow_leading_hyphen(); args.push(arg); } fn flag_pretty(args: &mut Vec) { const SHORT: &str = "Alias for --color always --heading --line-number."; const LONG: &str = long!("\ This is a convenience alias for '--color always --heading --line-number'. This flag is useful when you still want pretty output even if you're piping ripgrep to another program or file. For example: 'rg -p foo | less -R'. "); let arg = RGArg::switch("pretty").short("p") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_quiet(args: &mut Vec) { const SHORT: &str = "Do not print anything to stdout."; const LONG: &str = long!("\ Do not print anything to stdout. If a match is found in a file, then ripgrep will stop searching. This is useful when ripgrep is used only for its exit code (which will be an error if no matches are found). When --files is used, then ripgrep will stop finding files after finding the first file that matches all ignore rules. "); let arg = RGArg::switch("quiet").short("q") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_regex_size_limit(args: &mut Vec) { const SHORT: &str = "The upper size limit of the compiled regex."; const LONG: &str = long!("\ The upper size limit of the compiled regex. The default limit is 10M. The argument accepts the same size suffixes as allowed in the --max-filesize flag. "); let arg = RGArg::flag("regex-size-limit", "NUM+SUFFIX?") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_regexp(args: &mut Vec) { const SHORT: &str = "A pattern to search for."; const LONG: &str = long!("\ A pattern to search for. This option can be provided multiple times, where all patterns given are searched. Lines matching at least one of the provided patterns are printed. This flag can also be used when searching for patterns that start with a dash. For example, to search for the literal '-foo', you can use this flag: rg -e -foo You can also use the special '--' delimiter to indicate that no more flags will be provided. Namely, the following is equivalent to the above: rg -- -foo "); let arg = RGArg::flag("regexp", "PATTERN").short("e") .help(SHORT).long_help(LONG) .multiple() .allow_leading_hyphen(); args.push(arg); } fn flag_replace(args: &mut Vec) { const SHORT: &str = "Replace matches with the given text."; const LONG: &str = long!("\ Replace every match with the text given when printing results. Neither this flag nor any other ripgrep flag will modify your files. Capture group indices (e.g., $5) and names (e.g., $foo) are supported in the replacement string. In shells such as Bash and zsh, you should wrap the pattern in single quotes instead of double quotes. Otherwise, capture group indices will be replaced by expanded shell variables which will most likely be empty. Note that the replacement by default replaces each match, and NOT the entire line. To replace the entire line, you should match the entire line. This flag can be used with the -o/--only-matching flag. "); let arg = RGArg::flag("replace", "REPLACEMENT_TEXT").short("r") .help(SHORT).long_help(LONG) .allow_leading_hyphen(); args.push(arg); } fn flag_search_zip(args: &mut Vec) { const SHORT: &str = "Search in compressed files."; const LONG: &str = long!("\ Search in compressed files. Currently gzip, bzip2, xz, LZ4, LZMA, Brotli and Zstd files are supported. This option expects the decompression binaries to be available in your PATH. This flag can be disabled with --no-search-zip. "); let arg = RGArg::switch("search-zip").short("z") .help(SHORT).long_help(LONG) .overrides("no-search-zip") .overrides("pre"); args.push(arg); let arg = RGArg::switch("no-search-zip") .hidden() .overrides("search-zip"); args.push(arg); } fn flag_smart_case(args: &mut Vec) { const SHORT: &str = "Smart case search."; const LONG: &str = long!("\ Searches case insensitively if the pattern is all lowercase. Search case sensitively otherwise. This overrides the -s/--case-sensitive and -i/--ignore-case flags. "); let arg = RGArg::switch("smart-case").short("S") .help(SHORT).long_help(LONG) .overrides("case-sensitive") .overrides("ignore-case"); args.push(arg); } fn flag_sort_files(args: &mut Vec) { const SHORT: &str = "DEPRECATED"; const LONG: &str = long!("\ DEPRECATED: Use --sort or --sortr instead. Sort results by file path. Note that this currently disables all parallelism and runs search in a single thread. This flag can be disabled with --no-sort-files. "); let arg = RGArg::switch("sort-files") .help(SHORT).long_help(LONG) .hidden() .overrides("no-sort-files") .overrides("sort") .overrides("sortr"); args.push(arg); let arg = RGArg::switch("no-sort-files") .hidden() .overrides("sort-files") .overrides("sort") .overrides("sortr"); args.push(arg); } fn flag_sort(args: &mut Vec) { const SHORT: &str = "Sort results in ascending order. Implies --threads=1."; const LONG: &str = long!("\ This flag enables sorting of results in ascending order. The possible values for this flag are: path Sort by file path. modified Sort by the last modified time on a file. accessed Sort by the last accessed time on a file. created Sort by the creation time on a file. none Do not sort results. If the sorting criteria isn't available on your system (for example, creation time is not available on ext4 file systems), then ripgrep will attempt to detect this and print an error without searching any results. Otherwise, the sort order is unspecified. To sort results in reverse or descending order, use the --sortr flag. Also, this flag overrides --sortr. Note that sorting results currently always forces ripgrep to abandon parallelism and run in a single thread. "); let arg = RGArg::flag("sort", "SORTBY") .help(SHORT).long_help(LONG) .possible_values(&["path", "modified", "accessed", "created", "none"]) .overrides("sortr") .overrides("sort-files") .overrides("no-sort-files"); args.push(arg); } fn flag_sortr(args: &mut Vec) { const SHORT: &str = "Sort results in descending order. Implies --threads=1."; const LONG: &str = long!("\ This flag enables sorting of results in descending order. The possible values for this flag are: path Sort by file path. modified Sort by the last modified time on a file. accessed Sort by the last accessed time on a file. created Sort by the creation time on a file. none Do not sort results. If the sorting criteria isn't available on your system (for example, creation time is not available on ext4 file systems), then ripgrep will attempt to detect this and print an error without searching any results. Otherwise, the sort order is unspecified. To sort results in ascending order, use the --sort flag. Also, this flag overrides --sort. Note that sorting results currently always forces ripgrep to abandon parallelism and run in a single thread. "); let arg = RGArg::flag("sortr", "SORTBY") .help(SHORT).long_help(LONG) .possible_values(&["path", "modified", "accessed", "created", "none"]) .overrides("sort") .overrides("sort-files") .overrides("no-sort-files"); args.push(arg); } fn flag_stats(args: &mut Vec) { const SHORT: &str = "Print statistics about this ripgrep search."; const LONG: &str = long!("\ Print aggregate statistics about this ripgrep search. When this flag is present, ripgrep will print the following stats to stdout at the end of the search: number of matched lines, number of files with matches, number of files searched, and the time taken for the entire search to complete. This set of aggregate statistics may expand over time. Note that this flag has no effect if --files, --files-with-matches or --files-without-match is passed. This flag can be disabled with --no-stats. "); let arg = RGArg::switch("stats") .help(SHORT).long_help(LONG) .overrides("no-stats"); args.push(arg); let arg = RGArg::switch("no-stats") .hidden() .overrides("stats"); args.push(arg); } fn flag_text(args: &mut Vec) { const SHORT: &str = "Search binary files as if they were text."; const LONG: &str = long!("\ Search binary files as if they were text. When this flag is present, ripgrep's binary file detection is disabled. This means that when a binary file is searched, its contents may be printed if there is a match. This may cause escape codes to be printed that alter the behavior of your terminal. When binary file detection is enabled it is imperfect. In general, it uses a simple heuristic. If a NUL byte is seen during search, then the file is considered binary and search stops (unless this flag is present). Alternatively, if the '--binary' flag is used, then ripgrep will only quit when it sees a NUL byte after it sees a match (or searches the entire file). This flag can be disabled with '--no-text'. It overrides the '--binary' flag. "); let arg = RGArg::switch("text").short("a") .help(SHORT).long_help(LONG) .overrides("no-text") .overrides("binary") .overrides("no-binary"); args.push(arg); let arg = RGArg::switch("no-text") .hidden() .overrides("text") .overrides("binary") .overrides("no-binary"); args.push(arg); } fn flag_threads(args: &mut Vec) { const SHORT: &str = "The approximate number of threads to use."; const LONG: &str = long!("\ The approximate number of threads to use. A value of 0 (which is the default) causes ripgrep to choose the thread count using heuristics. "); let arg = RGArg::flag("threads", "NUM").short("j") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_trim(args: &mut Vec) { const SHORT: &str = "Trim prefixed whitespace from matches."; const LONG: &str = long!("\ When set, all ASCII whitespace at the beginning of each line printed will be trimmed. This flag can be disabled with --no-trim. "); let arg = RGArg::switch("trim") .help(SHORT).long_help(LONG) .overrides("no-trim"); args.push(arg); let arg = RGArg::switch("no-trim") .hidden() .overrides("trim"); args.push(arg); } fn flag_type(args: &mut Vec) { const SHORT: &str = "Only search files matching TYPE."; const LONG: &str = long!("\ Only search files matching TYPE. Multiple type flags may be provided. Use the --type-list flag to list all available types. "); let arg = RGArg::flag("type", "TYPE").short("t") .help(SHORT).long_help(LONG) .multiple(); args.push(arg); } fn flag_type_add(args: &mut Vec) { const SHORT: &str = "Add a new glob for a file type."; const LONG: &str = long!("\ Add a new glob for a particular file type. Only one glob can be added at a time. Multiple --type-add flags can be provided. Unless --type-clear is used, globs are added to any existing globs defined inside of ripgrep. Note that this MUST be passed to every invocation of ripgrep. Type settings are NOT persisted. Example: rg --type-add 'foo:*.foo' -tfoo PATTERN. --type-add can also be used to include rules from other types with the special include directive. The include directive permits specifying one or more other type names (separated by a comma) that have been defined and its rules will automatically be imported into the type specified. For example, to create a type called src that matches C++, Python and Markdown files, one can use: --type-add 'src:include:cpp,py,md' Additional glob rules can still be added to the src type by using the --type-add flag again: --type-add 'src:include:cpp,py,md' --type-add 'src:*.foo' Note that type names must consist only of Unicode letters or numbers. Punctuation characters are not allowed. "); let arg = RGArg::flag("type-add", "TYPE_SPEC") .help(SHORT).long_help(LONG) .multiple(); args.push(arg); } fn flag_type_clear(args: &mut Vec) { const SHORT: &str = "Clear globs for a file type."; const LONG: &str = long!("\ Clear the file type globs previously defined for TYPE. This only clears the default type definitions that are found inside of ripgrep. Note that this MUST be passed to every invocation of ripgrep. Type settings are NOT persisted. "); let arg = RGArg::flag("type-clear", "TYPE") .help(SHORT).long_help(LONG) .multiple(); args.push(arg); } fn flag_type_not(args: &mut Vec) { const SHORT: &str = "Do not search files matching TYPE."; const LONG: &str = long!("\ Do not search files matching TYPE. Multiple type-not flags may be provided. Use the --type-list flag to list all available types. "); let arg = RGArg::flag("type-not", "TYPE").short("T") .help(SHORT).long_help(LONG) .multiple(); args.push(arg); } fn flag_type_list(args: &mut Vec) { const SHORT: &str = "Show all supported file types."; const LONG: &str = long!("\ Show all supported file types and their corresponding globs. "); let arg = RGArg::switch("type-list") .help(SHORT).long_help(LONG) // This also technically conflicts with PATTERN, but the first file // path will actually be in PATTERN. .conflicts(&["file", "files", "pattern", "regexp"]); args.push(arg); } fn flag_unrestricted(args: &mut Vec) { const SHORT: &str = "Reduce the level of \"smart\" searching."; const LONG: &str = long!("\ Reduce the level of \"smart\" searching. A single -u won't respect .gitignore (etc.) files. Two -u flags will additionally search hidden files and directories. Three -u flags will additionally search binary files. 'rg -uuu' is roughly equivalent to 'grep -r'. "); let arg = RGArg::switch("unrestricted").short("u") .help(SHORT).long_help(LONG) .multiple(); args.push(arg); } fn flag_vimgrep(args: &mut Vec) { const SHORT: &str = "Show results in vim compatible format."; const LONG: &str = long!("\ Show results with every match on its own line, including line numbers and column numbers. With this option, a line with more than one match will be printed more than once. "); let arg = RGArg::switch("vimgrep") .help(SHORT).long_help(LONG); args.push(arg); } fn flag_with_filename(args: &mut Vec) { const SHORT: &str = "Print the file path with the matched lines."; const LONG: &str = long!("\ Display the file path for matches. This is the default when more than one file is searched. If --heading is enabled (the default when printing to a terminal), the file path will be shown above clusters of matches from each file; otherwise, the file name will be shown as a prefix for each matched line. This flag overrides --no-filename. "); let arg = RGArg::switch("with-filename").short("H") .help(SHORT).long_help(LONG) .overrides("no-filename"); args.push(arg); const NO_SHORT: &str = "Never print the file path with the matched lines."; const NO_LONG: &str = long!("\ Never print the file path with the matched lines. This is the default when ripgrep is explicitly instructed to search one file or stdin. This flag overrides --with-filename. "); let arg = RGArg::switch("no-filename").short("I") .help(NO_SHORT).long_help(NO_LONG) .overrides("with-filename"); args.push(arg); } fn flag_word_regexp(args: &mut Vec) { const SHORT: &str = "Only show matches surrounded by word boundaries."; const LONG: &str = long!("\ Only show matches surrounded by word boundaries. This is roughly equivalent to putting \\b before and after all of the search patterns. This overrides the --line-regexp flag. "); let arg = RGArg::switch("word-regexp").short("w") .help(SHORT).long_help(LONG) .overrides("line-regexp"); args.push(arg); } ripgrep-11.0.2/src/args.rs010064400017500000144000001753771352065447300136060ustar0000000000000000use std::cmp; use std::env; use std::ffi::{OsStr, OsString}; use std::fs; use std::io::{self, Write}; use std::path::{Path, PathBuf}; use std::process; use std::sync::Arc; use std::time::SystemTime; use clap; use grep::cli; use grep::matcher::LineTerminator; #[cfg(feature = "pcre2")] use grep::pcre2::{ RegexMatcher as PCRE2RegexMatcher, RegexMatcherBuilder as PCRE2RegexMatcherBuilder, }; use grep::printer::{ ColorSpecs, Stats, JSON, JSONBuilder, Standard, StandardBuilder, Summary, SummaryBuilder, SummaryKind, default_color_specs, }; use grep::regex::{ RegexMatcher as RustRegexMatcher, RegexMatcherBuilder as RustRegexMatcherBuilder, }; use grep::searcher::{ BinaryDetection, Encoding, MmapChoice, Searcher, SearcherBuilder, }; use ignore::overrides::{Override, OverrideBuilder}; use ignore::types::{FileTypeDef, Types, TypesBuilder}; use ignore::{Walk, WalkBuilder, WalkParallel}; use log; use num_cpus; use regex; use termcolor::{ WriteColor, BufferWriter, ColorChoice, }; use crate::app; use crate::config; use crate::logger::Logger; use crate::messages::{set_messages, set_ignore_messages}; use crate::path_printer::{PathPrinter, PathPrinterBuilder}; use crate::search::{ PatternMatcher, Printer, SearchWorker, SearchWorkerBuilder, }; use crate::subject::SubjectBuilder; use crate::Result; /// The command that ripgrep should execute based on the command line /// configuration. #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum Command { /// Search using exactly one thread. Search, /// Search using possibly many threads. SearchParallel, /// The command line parameters suggest that a search should occur, but /// ripgrep knows that a match can never be found (e.g., no given patterns /// or --max-count=0). SearchNever, /// Show the files that would be searched, but don't actually search them, /// and use exactly one thread. Files, /// Show the files that would be searched, but don't actually search them, /// and perform directory traversal using possibly many threads. FilesParallel, /// List all file type definitions configured, including the default file /// types and any additional file types added to the command line. Types, /// Print the version of PCRE2 in use. PCRE2Version, } impl Command { /// Returns true if and only if this command requires executing a search. fn is_search(&self) -> bool { use self::Command::*; match *self { Search | SearchParallel => true, | SearchNever | Files | FilesParallel | Types | PCRE2Version => false, } } } /// The primary configuration object used throughout ripgrep. It provides a /// high-level convenient interface to the provided command line arguments. /// /// An `Args` object is cheap to clone and can be used from multiple threads /// simultaneously. #[derive(Clone, Debug)] pub struct Args(Arc); #[derive(Clone, Debug)] struct ArgsImp { /// Mid-to-low level routines for extracting CLI arguments. matches: ArgMatches, /// The patterns provided at the command line and/or via the -f/--file /// flag. This may be empty. patterns: Vec, /// A matcher built from the patterns. /// /// It's important that this is only built once, since building this goes /// through regex compilation and various types of analyses. That is, if /// you need many of theses (one per thread, for example), it is better to /// build it once and then clone it. matcher: PatternMatcher, /// The paths provided at the command line. This is guaranteed to be /// non-empty. (If no paths are provided, then a default path is created.) paths: Vec, /// Returns true if and only if `paths` had to be populated with a single /// default path. using_default_path: bool, } impl Args { /// Parse the command line arguments for this process. /// /// If a CLI usage error occurred, then exit the process and print a usage /// or error message. Similarly, if the user requested the version of /// ripgrep, then print the version and exit. /// /// Also, initialize a global logger. pub fn parse() -> Result { // We parse the args given on CLI. This does not include args from // the config. We use the CLI args as an initial configuration while // trying to parse config files. If a config file exists and has // arguments, then we re-parse argv, otherwise we just use the matches // we have here. let early_matches = ArgMatches::new(clap_matches(env::args_os())?); set_messages(!early_matches.is_present("no-messages")); set_ignore_messages(!early_matches.is_present("no-ignore-messages")); if let Err(err) = Logger::init() { return Err(format!("failed to initialize logger: {}", err).into()); } if early_matches.is_present("trace") { log::set_max_level(log::LevelFilter::Trace); } else if early_matches.is_present("debug") { log::set_max_level(log::LevelFilter::Debug); } else { log::set_max_level(log::LevelFilter::Warn); } let matches = early_matches.reconfigure()?; // The logging level may have changed if we brought in additional // arguments from a configuration file, so recheck it and set the log // level as appropriate. if matches.is_present("trace") { log::set_max_level(log::LevelFilter::Trace); } else if matches.is_present("debug") { log::set_max_level(log::LevelFilter::Debug); } else { log::set_max_level(log::LevelFilter::Warn); } set_messages(!matches.is_present("no-messages")); set_ignore_messages(!matches.is_present("no-ignore-messages")); matches.to_args() } /// Return direct access to command line arguments. fn matches(&self) -> &ArgMatches { &self.0.matches } /// Return the patterns found in the command line arguments. This includes /// patterns read via the -f/--file flags. fn patterns(&self) -> &[String] { &self.0.patterns } /// Return the matcher builder from the patterns. fn matcher(&self) -> &PatternMatcher { &self.0.matcher } /// Return the paths found in the command line arguments. This is /// guaranteed to be non-empty. In the case where no explicit arguments are /// provided, a single default path is provided automatically. fn paths(&self) -> &[PathBuf] { &self.0.paths } /// Returns true if and only if `paths` had to be populated with a default /// path, which occurs only when no paths were given as command line /// arguments. fn using_default_path(&self) -> bool { self.0.using_default_path } /// Return the printer that should be used for formatting the output of /// search results. /// /// The returned printer will write results to the given writer. fn printer(&self, wtr: W) -> Result> { match self.matches().output_kind() { OutputKind::Standard => { let separator_search = self.command()? == Command::Search; self.matches() .printer_standard(self.paths(), wtr, separator_search) .map(Printer::Standard) } OutputKind::Summary => { self.matches() .printer_summary(self.paths(), wtr) .map(Printer::Summary) } OutputKind::JSON => { self.matches() .printer_json(wtr) .map(Printer::JSON) } } } } /// High level public routines for building data structures used by ripgrep /// from command line arguments. impl Args { /// Create a new buffer writer for multi-threaded printing with color /// support. pub fn buffer_writer(&self) -> Result { let mut wtr = BufferWriter::stdout(self.matches().color_choice()); wtr.separator(self.matches().file_separator()?); Ok(wtr) } /// Return the high-level command that ripgrep should run. pub fn command(&self) -> Result { let is_one_search = self.matches().is_one_search(self.paths()); let threads = self.matches().threads()?; let one_thread = is_one_search || threads == 1; Ok(if self.matches().is_present("pcre2-version") { Command::PCRE2Version } else if self.matches().is_present("type-list") { Command::Types } else if self.matches().is_present("files") { if one_thread { Command::Files } else { Command::FilesParallel } } else if self.matches().can_never_match(self.patterns()) { Command::SearchNever } else if one_thread { Command::Search } else { Command::SearchParallel }) } /// Builder a path printer that can be used for printing just file paths, /// with optional color support. /// /// The printer will print paths to the given writer. pub fn path_printer( &self, wtr: W, ) -> Result> { let mut builder = PathPrinterBuilder::new(); builder .color_specs(self.matches().color_specs()?) .separator(self.matches().path_separator()?) .terminator(self.matches().path_terminator().unwrap_or(b'\n')); Ok(builder.build(wtr)) } /// Returns true if and only if ripgrep should be "quiet." pub fn quiet(&self) -> bool { self.matches().is_present("quiet") } /// Returns true if and only if the search should quit after finding the /// first match. pub fn quit_after_match(&self) -> Result { Ok(self.matches().is_present("quiet") && self.stats()?.is_none()) } /// Build a worker for executing searches. /// /// Search results are written to the given writer. pub fn search_worker( &self, wtr: W, ) -> Result> { let matches = self.matches(); let matcher = self.matcher().clone(); let printer = self.printer(wtr)?; let searcher = matches.searcher(self.paths())?; let mut builder = SearchWorkerBuilder::new(); builder .json_stats(matches.is_present("json")) .preprocessor(matches.preprocessor()) .preprocessor_globs(matches.preprocessor_globs()?) .search_zip(matches.is_present("search-zip")) .binary_detection_implicit(matches.binary_detection_implicit()) .binary_detection_explicit(matches.binary_detection_explicit()); Ok(builder.build(matcher, searcher, printer)) } /// Returns a zero value for tracking statistics if and only if it has been /// requested. /// /// When this returns a `Stats` value, then it is guaranteed that the /// search worker will be configured to track statistics as well. pub fn stats(&self) -> Result> { Ok(if self.command()?.is_search() && self.matches().stats() { Some(Stats::new()) } else { None }) } /// Return a builder for constructing subjects. A subject represents a /// single unit of something to search. Typically, this corresponds to a /// file or a stream such as stdin. pub fn subject_builder(&self) -> SubjectBuilder { let mut builder = SubjectBuilder::new(); builder.strip_dot_prefix(self.using_default_path()); builder } /// Execute the given function with a writer to stdout that enables color /// support based on the command line configuration. pub fn stdout(&self) -> cli::StandardStream { let color = self.matches().color_choice(); if self.matches().is_present("line-buffered") { cli::stdout_buffered_line(color) } else if self.matches().is_present("block-buffered") { cli::stdout_buffered_block(color) } else { cli::stdout(color) } } /// Return the type definitions compiled into ripgrep. /// /// If there was a problem reading and parsing the type definitions, then /// this returns an error. pub fn type_defs(&self) -> Result> { Ok(self.matches().types()?.definitions().to_vec()) } /// Return a walker that never uses additional threads. pub fn walker(&self) -> Result { Ok(self.matches().walker_builder(self.paths())?.build()) } /// Return a walker that never uses additional threads. pub fn walker_parallel(&self) -> Result { Ok(self.matches().walker_builder(self.paths())?.build_parallel()) } } /// `ArgMatches` wraps `clap::ArgMatches` and provides semantic meaning to /// the parsed arguments. #[derive(Clone, Debug)] struct ArgMatches(clap::ArgMatches<'static>); /// The output format. Generally, this corresponds to the printer that ripgrep /// uses to show search results. #[derive(Clone, Copy, Debug, Eq, PartialEq)] enum OutputKind { /// Classic grep-like or ack-like format. Standard, /// Show matching files and possibly the number of matches in each file. Summary, /// Emit match information in the JSON Lines format. JSON, } /// The sort criteria, if present. #[derive(Clone, Copy, Debug, Eq, PartialEq)] struct SortBy { /// Whether to reverse the sort criteria (i.e., descending order). reverse: bool, /// The actual sorting criteria. kind: SortByKind, } #[derive(Clone, Copy, Debug, Eq, PartialEq)] enum SortByKind { /// No sorting at all. None, /// Sort by path. Path, /// Sort by last modified time. LastModified, /// Sort by last accessed time. LastAccessed, /// Sort by creation time. Created, } impl SortBy { fn asc(kind: SortByKind) -> SortBy { SortBy { reverse: false, kind: kind } } fn desc(kind: SortByKind) -> SortBy { SortBy { reverse: true, kind: kind } } fn none() -> SortBy { SortBy::asc(SortByKind::None) } /// Try to check that the sorting criteria selected is actually supported. /// If it isn't, then an error is returned. fn check(&self) -> Result<()> { match self.kind { SortByKind::None | SortByKind::Path => {} SortByKind::LastModified => { env::current_exe()?.metadata()?.modified()?; } SortByKind::LastAccessed => { env::current_exe()?.metadata()?.accessed()?; } SortByKind::Created => { env::current_exe()?.metadata()?.created()?; } } Ok(()) } fn configure_walk_builder(self, builder: &mut WalkBuilder) { // This isn't entirely optimal. In particular, we will wind up issuing // a stat for many files redundantly. Aside from having potentially // inconsistent results with respect to sorting, this is also slow. // We could fix this here at the expense of memory by caching stat // calls. A better fix would be to find a way to push this down into // directory traversal itself, but that's a somewhat nasty change. match self.kind { SortByKind::None => {} SortByKind::Path => { if self.reverse { builder.sort_by_file_name(|a, b| a.cmp(b).reverse()); } else { builder.sort_by_file_name(|a, b| a.cmp(b)); } } SortByKind::LastModified => { builder.sort_by_file_path(move |a, b| { sort_by_metadata_time( a, b, self.reverse, |md| md.modified(), ) }); } SortByKind::LastAccessed => { builder.sort_by_file_path(move |a, b| { sort_by_metadata_time( a, b, self.reverse, |md| md.accessed(), ) }); } SortByKind::Created => { builder.sort_by_file_path(move |a, b| { sort_by_metadata_time( a, b, self.reverse, |md| md.created(), ) }); } } } } impl SortByKind { fn new(kind: &str) -> SortByKind { match kind { "none" => SortByKind::None, "path" => SortByKind::Path, "modified" => SortByKind::LastModified, "accessed" => SortByKind::LastAccessed, "created" => SortByKind::Created, _ => SortByKind::None, } } } /// Encoding mode the searcher will use. #[derive(Clone, Debug)] enum EncodingMode { /// Use an explicit encoding forcefully, but let BOM sniffing override it. Some(Encoding), /// Use only BOM sniffing to auto-detect an encoding. Auto, /// Use no explicit encoding and disable all BOM sniffing. This will /// always result in searching the raw bytes, regardless of their /// true encoding. Disabled, } impl EncodingMode { /// Checks if an explicit encoding has been set. Returns false for /// automatic BOM sniffing and no sniffing. /// /// This is only used to determine whether PCRE2 needs to have its own /// UTF-8 checking enabled. If we have an explicit encoding set, then /// we're always guaranteed to get UTF-8, so we can disable PCRE2's check. /// Otherwise, we have no such guarantee, and must enable PCRE2' UTF-8 /// check. #[cfg(feature = "pcre2")] fn has_explicit_encoding(&self) -> bool { match self { EncodingMode::Some(_) => true, _ => false } } } impl ArgMatches { /// Create an ArgMatches from clap's parse result. fn new(clap_matches: clap::ArgMatches<'static>) -> ArgMatches { ArgMatches(clap_matches) } /// Run clap and return the matches using a config file if present. If clap /// determines a problem with the user provided arguments (or if --help or /// --version are given), then an error/usage/version will be printed and /// the process will exit. /// /// If there are no additional arguments from the environment (e.g., a /// config file), then the given matches are returned as is. fn reconfigure(self) -> Result { // If the end user says no config, then respect it. if self.is_present("no-config") { log::debug!( "not reading config files because --no-config is present" ); return Ok(self); } // If the user wants ripgrep to use a config file, then parse args // from that first. let mut args = config::args(); if args.is_empty() { return Ok(self); } let mut cliargs = env::args_os(); if let Some(bin) = cliargs.next() { args.insert(0, bin); } args.extend(cliargs); log::debug!("final argv: {:?}", args); Ok(ArgMatches(clap_matches(args)?)) } /// Convert the result of parsing CLI arguments into ripgrep's higher level /// configuration structure. fn to_args(self) -> Result { // We compute these once since they could be large. let patterns = self.patterns()?; let matcher = self.matcher(&patterns)?; let mut paths = self.paths(); let using_default_path = if paths.is_empty() { paths.push(self.path_default()); true } else { false }; Ok(Args(Arc::new(ArgsImp { matches: self, patterns: patterns, matcher: matcher, paths: paths, using_default_path: using_default_path, }))) } } /// High level routines for converting command line arguments into various /// data structures used by ripgrep. /// /// Methods are sorted alphabetically. impl ArgMatches { /// Return the matcher that should be used for searching. /// /// If there was a problem building the matcher (e.g., a syntax error), /// then this returns an error. #[cfg(feature = "pcre2")] fn matcher(&self, patterns: &[String]) -> Result { if self.is_present("pcre2") { let matcher = self.matcher_pcre2(patterns)?; Ok(PatternMatcher::PCRE2(matcher)) } else if self.is_present("auto-hybrid-regex") { let rust_err = match self.matcher_rust(patterns) { Ok(matcher) => return Ok(PatternMatcher::RustRegex(matcher)), Err(err) => err, }; log::debug!( "error building Rust regex in hybrid mode:\n{}", rust_err, ); let pcre_err = match self.matcher_pcre2(patterns) { Ok(matcher) => return Ok(PatternMatcher::PCRE2(matcher)), Err(err) => err, }; Err(From::from(format!( "regex could not be compiled with either the default regex \ engine or with PCRE2.\n\n\ default regex engine error:\n{}\n{}\n{}\n\n\ PCRE2 regex engine error:\n{}", "~".repeat(79), rust_err, "~".repeat(79), pcre_err, ))) } else { let matcher = match self.matcher_rust(patterns) { Ok(matcher) => matcher, Err(err) => { return Err(From::from(suggest_pcre2(err.to_string()))); } }; Ok(PatternMatcher::RustRegex(matcher)) } } /// Return the matcher that should be used for searching. /// /// If there was a problem building the matcher (e.g., a syntax error), /// then this returns an error. #[cfg(not(feature = "pcre2"))] fn matcher(&self, patterns: &[String]) -> Result { if self.is_present("pcre2") { return Err(From::from( "PCRE2 is not available in this build of ripgrep", )); } let matcher = self.matcher_rust(patterns)?; Ok(PatternMatcher::RustRegex(matcher)) } /// Build a matcher using Rust's regex engine. /// /// If there was a problem building the matcher (such as a regex syntax /// error), then an error is returned. fn matcher_rust(&self, patterns: &[String]) -> Result { let mut builder = RustRegexMatcherBuilder::new(); builder .case_smart(self.case_smart()) .case_insensitive(self.case_insensitive()) .multi_line(true) .unicode(true) .octal(false) .word(self.is_present("word-regexp")); if self.is_present("multiline") { builder.dot_matches_new_line(self.is_present("multiline-dotall")); if self.is_present("crlf") { builder .crlf(true) .line_terminator(None); } } else { builder .line_terminator(Some(b'\n')) .dot_matches_new_line(false); if self.is_present("crlf") { builder.crlf(true); } // We don't need to set this in multiline mode since mulitline // matchers don't use optimizations related to line terminators. // Moreover, a mulitline regex used with --null-data should // be allowed to match NUL bytes explicitly, which this would // otherwise forbid. if self.is_present("null-data") { builder.line_terminator(Some(b'\x00')); } } if let Some(limit) = self.regex_size_limit()? { builder.size_limit(limit); } if let Some(limit) = self.dfa_size_limit()? { builder.dfa_size_limit(limit); } let res = if self.is_present("fixed-strings") { builder.build_literals(patterns) } else { builder.build(&patterns.join("|")) }; match res { Ok(m) => Ok(m), Err(err) => Err(From::from(suggest_multiline(err.to_string()))), } } /// Build a matcher using PCRE2. /// /// If there was a problem building the matcher (such as a regex syntax /// error), then an error is returned. #[cfg(feature = "pcre2")] fn matcher_pcre2(&self, patterns: &[String]) -> Result { let mut builder = PCRE2RegexMatcherBuilder::new(); builder .case_smart(self.case_smart()) .caseless(self.case_insensitive()) .multi_line(true) .word(self.is_present("word-regexp")); // For whatever reason, the JIT craps out during regex compilation with // a "no more memory" error on 32 bit systems. So don't use it there. if cfg!(target_pointer_width = "64") { builder .jit_if_available(true) // The PCRE2 docs say that 32KB is the default, and that 1MB // should be big enough for anything. But let's crank it to // 10MB. .max_jit_stack_size(Some(10 * (1<<20))); } if self.pcre2_unicode() { builder.utf(true).ucp(true); if self.encoding()?.has_explicit_encoding() { // SAFETY: If an encoding was specified, then we're guaranteed // to get valid UTF-8, so we can disable PCRE2's UTF checking. // (Feeding invalid UTF-8 to PCRE2 is undefined behavior.) unsafe { builder.disable_utf_check(); } } } if self.is_present("multiline") { builder.dotall(self.is_present("multiline-dotall")); } if self.is_present("crlf") { builder.crlf(true); } Ok(builder.build(&patterns.join("|"))?) } /// Build a JSON printer that writes results to the given writer. fn printer_json(&self, wtr: W) -> Result> { let mut builder = JSONBuilder::new(); builder .pretty(false) .max_matches(self.max_count()?) .always_begin_end(false); Ok(builder.build(wtr)) } /// Build a Standard printer that writes results to the given writer. /// /// The given paths are used to configure aspects of the printer. /// /// If `separator_search` is true, then the returned printer will assume /// the responsibility of printing a separator between each set of /// search results, when appropriate (e.g., when contexts are enabled). /// When it's set to false, the caller is responsible for handling /// separators. /// /// In practice, we want the printer to handle it in the single threaded /// case but not in the multi-threaded case. fn printer_standard( &self, paths: &[PathBuf], wtr: W, separator_search: bool, ) -> Result> { let mut builder = StandardBuilder::new(); builder .color_specs(self.color_specs()?) .stats(self.stats()) .heading(self.heading()) .path(self.with_filename(paths)) .only_matching(self.is_present("only-matching")) .per_match(self.is_present("vimgrep")) .replacement(self.replacement()) .max_columns(self.max_columns()?) .max_columns_preview(self.max_columns_preview()) .max_matches(self.max_count()?) .column(self.column()) .byte_offset(self.is_present("byte-offset")) .trim_ascii(self.is_present("trim")) .separator_search(None) .separator_context(Some(self.context_separator())) .separator_field_match(b":".to_vec()) .separator_field_context(b"-".to_vec()) .separator_path(self.path_separator()?) .path_terminator(self.path_terminator()); if separator_search { builder.separator_search(self.file_separator()?); } Ok(builder.build(wtr)) } /// Build a Summary printer that writes results to the given writer. /// /// The given paths are used to configure aspects of the printer. /// /// This panics if the output format is not `OutputKind::Summary`. fn printer_summary( &self, paths: &[PathBuf], wtr: W, ) -> Result> { let mut builder = SummaryBuilder::new(); builder .kind(self.summary_kind().expect("summary format")) .color_specs(self.color_specs()?) .stats(self.stats()) .path(self.with_filename(paths)) .max_matches(self.max_count()?) .separator_field(b":".to_vec()) .separator_path(self.path_separator()?) .path_terminator(self.path_terminator()); Ok(builder.build(wtr)) } /// Build a searcher from the command line parameters. fn searcher(&self, paths: &[PathBuf]) -> Result { let (ctx_before, ctx_after) = self.contexts()?; let line_term = if self.is_present("crlf") { LineTerminator::crlf() } else if self.is_present("null-data") { LineTerminator::byte(b'\x00') } else { LineTerminator::byte(b'\n') }; let mut builder = SearcherBuilder::new(); builder .line_terminator(line_term) .invert_match(self.is_present("invert-match")) .line_number(self.line_number(paths)) .multi_line(self.is_present("multiline")) .before_context(ctx_before) .after_context(ctx_after) .passthru(self.is_present("passthru")) .memory_map(self.mmap_choice(paths)); match self.encoding()? { EncodingMode::Some(enc) => { builder.encoding(Some(enc)); } EncodingMode::Auto => {} // default for the searcher EncodingMode::Disabled => { builder.bom_sniffing(false); } } Ok(builder.build()) } /// Return a builder for recursively traversing a directory while /// respecting ignore rules. /// /// If there was a problem parsing the CLI arguments necessary for /// constructing the builder, then this returns an error. fn walker_builder(&self, paths: &[PathBuf]) -> Result { let mut builder = WalkBuilder::new(&paths[0]); for path in &paths[1..] { builder.add(path); } for path in self.ignore_paths() { if let Some(err) = builder.add_ignore(path) { ignore_message!("{}", err); } } builder .max_depth(self.usize_of("max-depth")?) .follow_links(self.is_present("follow")) .max_filesize(self.max_file_size()?) .threads(self.threads()?) .same_file_system(self.is_present("one-file-system")) .skip_stdout(!self.is_present("files")) .overrides(self.overrides()?) .types(self.types()?) .hidden(!self.hidden()) .parents(!self.no_ignore_parent()) .ignore(!self.no_ignore_dot()) .git_global(!self.no_ignore_vcs() && !self.no_ignore_global()) .git_ignore(!self.no_ignore_vcs()) .git_exclude(!self.no_ignore_vcs()) .ignore_case_insensitive(self.ignore_file_case_insensitive()); if !self.no_ignore() { builder.add_custom_ignore_filename(".rgignore"); } let sortby = self.sort_by()?; sortby.check()?; sortby.configure_walk_builder(&mut builder); Ok(builder) } } /// Mid level routines for converting command line arguments into various types /// of data structures. /// /// Methods are sorted alphabetically. impl ArgMatches { /// Returns the form of binary detection to perform on files that are /// implicitly searched via recursive directory traversal. fn binary_detection_implicit(&self) -> BinaryDetection { let none = self.is_present("text") || self.is_present("null-data"); let convert = self.is_present("binary") || self.unrestricted_count() >= 3; if none { BinaryDetection::none() } else if convert { BinaryDetection::convert(b'\x00') } else { BinaryDetection::quit(b'\x00') } } /// Returns the form of binary detection to perform on files that are /// explicitly searched via the user invoking ripgrep on a particular /// file or files or stdin. /// /// In general, this should never be BinaryDetection::quit, since that acts /// as a filter (but quitting immediately once a NUL byte is seen), and we /// should never filter out files that the user wants to explicitly search. fn binary_detection_explicit(&self) -> BinaryDetection { let none = self.is_present("text") || self.is_present("null-data"); if none { BinaryDetection::none() } else { BinaryDetection::convert(b'\x00') } } /// Returns true if the command line configuration implies that a match /// can never be shown. fn can_never_match(&self, patterns: &[String]) -> bool { patterns.is_empty() || self.max_count().ok() == Some(Some(0)) } /// Returns true if and only if case should be ignore. /// /// If --case-sensitive is present, then case is never ignored, even if /// --ignore-case is present. fn case_insensitive(&self) -> bool { self.is_present("ignore-case") && !self.is_present("case-sensitive") } /// Returns true if and only if smart case has been enabled. /// /// If either --ignore-case of --case-sensitive are present, then smart /// case is disabled. fn case_smart(&self) -> bool { self.is_present("smart-case") && !self.is_present("ignore-case") && !self.is_present("case-sensitive") } /// Returns the user's color choice based on command line parameters and /// environment. fn color_choice(&self) -> ColorChoice { let preference = match self.value_of_lossy("color") { None => "auto".to_string(), Some(v) => v, }; if preference == "always" { ColorChoice::Always } else if preference == "ansi" { ColorChoice::AlwaysAnsi } else if preference == "auto" { if cli::is_tty_stdout() || self.is_present("pretty") { ColorChoice::Auto } else { ColorChoice::Never } } else { ColorChoice::Never } } /// Returns the color specifications given by the user on the CLI. /// /// If the was a problem parsing any of the provided specs, then an error /// is returned. fn color_specs(&self) -> Result { // Start with a default set of color specs. let mut specs = default_color_specs(); for spec_str in self.values_of_lossy_vec("colors") { specs.push(spec_str.parse()?); } Ok(ColorSpecs::new(&specs)) } /// Returns true if and only if column numbers should be shown. fn column(&self) -> bool { if self.is_present("no-column") { return false; } self.is_present("column") || self.is_present("vimgrep") } /// Returns the before and after contexts from the command line. /// /// If a context setting was absent, then `0` is returned. /// /// If there was a problem parsing the values from the user as an integer, /// then an error is returned. fn contexts(&self) -> Result<(usize, usize)> { let after = self.usize_of("after-context")?.unwrap_or(0); let before = self.usize_of("before-context")?.unwrap_or(0); let both = self.usize_of("context")?.unwrap_or(0); Ok(if both > 0 { (both, both) } else { (before, after) }) } /// Returns the unescaped context separator in UTF-8 bytes. /// /// If one was not provided, the default `--` is returned. fn context_separator(&self) -> Vec { match self.value_of_os("context-separator") { None => b"--".to_vec(), Some(sep) => cli::unescape_os(&sep), } } /// Returns whether the -c/--count or the --count-matches flags were /// passed from the command line. /// /// If --count-matches and --invert-match were passed in, behave /// as if --count and --invert-match were passed in (i.e. rg will /// count inverted matches as per existing behavior). fn counts(&self) -> (bool, bool) { let count = self.is_present("count"); let count_matches = self.is_present("count-matches"); let invert_matches = self.is_present("invert-match"); let only_matching = self.is_present("only-matching"); if count_matches && invert_matches { // Treat `-v --count-matches` as `-v -c`. (true, false) } else if count && only_matching { // Treat `-c --only-matching` as `--count-matches`. (false, true) } else { (count, count_matches) } } /// Parse the dfa-size-limit argument option into a byte count. fn dfa_size_limit(&self) -> Result> { let r = self.parse_human_readable_size("dfa-size-limit")?; u64_to_usize("dfa-size-limit", r) } /// Returns the encoding mode to use. /// /// This only returns an encoding if one is explicitly specified. Otherwise /// if set to automatic, the Searcher will do BOM sniffing for UTF-16 /// and transcode seamlessly. If disabled, no BOM sniffing nor transcoding /// will occur. fn encoding(&self) -> Result { if self.is_present("no-encoding") { return Ok(EncodingMode::Auto); } let label = match self.value_of_lossy("encoding") { None if self.pcre2_unicode() => "utf-8".to_string(), None => return Ok(EncodingMode::Auto), Some(label) => label, }; if label == "auto" { return Ok(EncodingMode::Auto); } else if label == "none" { return Ok(EncodingMode::Disabled); } Ok(EncodingMode::Some(Encoding::new(&label)?)) } /// Return the file separator to use based on the CLI configuration. fn file_separator(&self) -> Result>> { // File separators are only used for the standard grep-line format. if self.output_kind() != OutputKind::Standard { return Ok(None); } let (ctx_before, ctx_after) = self.contexts()?; Ok(if self.heading() { Some(b"".to_vec()) } else if ctx_before > 0 || ctx_after > 0 { Some(self.context_separator().clone()) } else { None }) } /// Returns true if and only if matches should be grouped with file name /// headings. fn heading(&self) -> bool { if self.is_present("no-heading") || self.is_present("vimgrep") { false } else { cli::is_tty_stdout() || self.is_present("heading") || self.is_present("pretty") } } /// Returns true if and only if hidden files/directories should be /// searched. fn hidden(&self) -> bool { self.is_present("hidden") || self.unrestricted_count() >= 2 } /// Returns true if ignore files should be processed case insensitively. fn ignore_file_case_insensitive(&self) -> bool { self.is_present("ignore-file-case-insensitive") } /// Return all of the ignore file paths given on the command line. fn ignore_paths(&self) -> Vec { let paths = match self.values_of_os("ignore-file") { None => return vec![], Some(paths) => paths, }; paths.map(|p| Path::new(p).to_path_buf()).collect() } /// Returns true if and only if ripgrep is invoked in a way where it knows /// it search exactly one thing. fn is_one_search(&self, paths: &[PathBuf]) -> bool { if paths.len() != 1 { return false; } self.is_only_stdin(paths) || paths[0].is_file() } /// Returns true if and only if we're only searching a single thing and /// that thing is stdin. fn is_only_stdin(&self, paths: &[PathBuf]) -> bool { paths == [Path::new("-")] } /// Returns true if and only if we should show line numbers. fn line_number(&self, paths: &[PathBuf]) -> bool { if self.output_kind() == OutputKind::Summary { return false; } if self.is_present("no-line-number") { return false; } if self.output_kind() == OutputKind::JSON { return true; } // A few things can imply counting line numbers. In particular, we // generally want to show line numbers by default when printing to a // tty for human consumption, except for one interesting case: when // we're only searching stdin. This makes pipelines work as expected. (cli::is_tty_stdout() && !self.is_only_stdin(paths)) || self.is_present("line-number") || self.is_present("column") || self.is_present("pretty") || self.is_present("vimgrep") } /// The maximum number of columns allowed on each line. /// /// If `0` is provided, then this returns `None`. fn max_columns(&self) -> Result> { Ok(self.usize_of_nonzero("max-columns")?.map(|n| n as u64)) } /// Returns true if and only if a preview should be shown for lines that /// exceed the maximum column limit. fn max_columns_preview(&self) -> bool { self.is_present("max-columns-preview") } /// The maximum number of matches permitted. fn max_count(&self) -> Result> { Ok(self.usize_of("max-count")?.map(|n| n as u64)) } /// Parses the max-filesize argument option into a byte count. fn max_file_size(&self) -> Result> { self.parse_human_readable_size("max-filesize") } /// Returns whether we should attempt to use memory maps or not. fn mmap_choice(&self, paths: &[PathBuf]) -> MmapChoice { // SAFETY: Memory maps are difficult to impossible to encapsulate // safely in a portable way that doesn't simultaneously negate some of // the benfits of using memory maps. For ripgrep's use, we never mutate // a memory map and generally never store the contents of memory map // in a data structure that depends on immutability. Generally // speaking, the worst thing that can happen is a SIGBUS (if the // underlying file is truncated while reading it), which will cause // ripgrep to abort. This reasoning should be treated as suspect. let maybe = unsafe { MmapChoice::auto() }; let never = MmapChoice::never(); if self.is_present("no-mmap") { never } else if self.is_present("mmap") { maybe } else if paths.len() <= 10 && paths.iter().all(|p| p.is_file()) { // If we're only searching a few paths and all of them are // files, then memory maps are probably faster. maybe } else { never } } /// Returns true if ignore files should be ignored. fn no_ignore(&self) -> bool { self.is_present("no-ignore") || self.unrestricted_count() >= 1 } /// Returns true if .ignore files should be ignored. fn no_ignore_dot(&self) -> bool { self.is_present("no-ignore-dot") || self.no_ignore() } /// Returns true if global ignore files should be ignored. fn no_ignore_global(&self) -> bool { self.is_present("no-ignore-global") || self.no_ignore() } /// Returns true if parent ignore files should be ignored. fn no_ignore_parent(&self) -> bool { self.is_present("no-ignore-parent") || self.no_ignore() } /// Returns true if VCS ignore files should be ignored. fn no_ignore_vcs(&self) -> bool { self.is_present("no-ignore-vcs") || self.no_ignore() } /// Determine the type of output we should produce. fn output_kind(&self) -> OutputKind { if self.is_present("quiet") { // While we don't technically print results (or aggregate results) // in quiet mode, we still support the --stats flag, and those // stats are computed by the Summary printer for now. return OutputKind::Summary; } else if self.is_present("json") { return OutputKind::JSON; } let (count, count_matches) = self.counts(); let summary = count || count_matches || self.is_present("files-with-matches") || self.is_present("files-without-match"); if summary { OutputKind::Summary } else { OutputKind::Standard } } /// Builds the set of glob overrides from the command line flags. fn overrides(&self) -> Result { let mut builder = OverrideBuilder::new(env::current_dir()?); // Make all globs case insensitive with --glob-case-insensitive. if self.is_present("glob-case-insensitive") { builder.case_insensitive(true).unwrap(); } for glob in self.values_of_lossy_vec("glob") { builder.add(&glob)?; } // This only enables case insensitivity for subsequent globs. builder.case_insensitive(true).unwrap(); for glob in self.values_of_lossy_vec("iglob") { builder.add(&glob)?; } Ok(builder.build()?) } /// Return all file paths that ripgrep should search. /// /// If no paths were given, then this returns an empty list. fn paths(&self) -> Vec { let mut paths: Vec = match self.values_of_os("path") { None => vec![], Some(paths) => paths.map(|p| Path::new(p).to_path_buf()).collect(), }; // If --file, --files or --regexp is given, then the first path is // always in `pattern`. if self.is_present("file") || self.is_present("files") || self.is_present("regexp") { if let Some(path) = self.value_of_os("pattern") { paths.insert(0, Path::new(path).to_path_buf()); } } paths } /// Return the default path that ripgrep should search. This should only /// be used when ripgrep is not otherwise given at least one file path /// as a positional argument. fn path_default(&self) -> PathBuf { let file_is_stdin = self.values_of_os("file") .map_or(false, |mut files| files.any(|f| f == "-")); let search_cwd = !cli::is_readable_stdin() || (self.is_present("file") && file_is_stdin) || self.is_present("files") || self.is_present("type-list") || self.is_present("pcre2-version"); if search_cwd { Path::new("./").to_path_buf() } else { Path::new("-").to_path_buf() } } /// Returns the unescaped path separator as a single byte, if one exists. /// /// If the provided path separator is more than a single byte, then an /// error is returned. fn path_separator(&self) -> Result> { let sep = match self.value_of_os("path-separator") { None => return Ok(None), Some(sep) => cli::unescape_os(&sep), }; if sep.is_empty() { Ok(None) } else if sep.len() > 1 { Err(From::from(format!( "A path separator must be exactly one byte, but \ the given separator is {} bytes: {}\n\ In some shells on Windows '/' is automatically \ expanded. Use '//' instead.", sep.len(), cli::escape(&sep), ))) } else { Ok(Some(sep[0])) } } /// Returns the byte that should be used to terminate paths. /// /// Typically, this is only set to `\x00` when the --null flag is provided, /// and `None` otherwise. fn path_terminator(&self) -> Option { if self.is_present("null") { Some(b'\x00') } else { None } } /// Get a sequence of all available patterns from the command line. /// This includes reading the -e/--regexp and -f/--file flags. /// /// Note that if -F/--fixed-strings is set, then all patterns will be /// escaped. If -x/--line-regexp is set, then all patterns are surrounded /// by `^...$`. Other things, such as --word-regexp, are handled by the /// regex matcher itself. /// /// If any pattern is invalid UTF-8, then an error is returned. fn patterns(&self) -> Result> { if self.is_present("files") || self.is_present("type-list") { return Ok(vec![]); } let mut pats = vec![]; match self.values_of_os("regexp") { None => { if self.values_of_os("file").is_none() { if let Some(os_pat) = self.value_of_os("pattern") { pats.push(self.pattern_from_os_str(os_pat)?); } } } Some(os_pats) => { for os_pat in os_pats { pats.push(self.pattern_from_os_str(os_pat)?); } } } if let Some(paths) = self.values_of_os("file") { for path in paths { if path == "-" { pats.extend(cli::patterns_from_stdin()? .into_iter() .map(|p| self.pattern_from_string(p)) ); } else { pats.extend(cli::patterns_from_path(path)? .into_iter() .map(|p| self.pattern_from_string(p)) ); } } } Ok(pats) } /// Returns a pattern that is guaranteed to produce an empty regular /// expression that is valid in any position. fn pattern_empty(&self) -> String { // This would normally just be an empty string, which works on its // own, but if the patterns are joined in a set of alternations, then // you wind up with `foo|`, which is currently invalid in Rust's regex // engine. "(?:z{0})*".to_string() } /// Converts an OsStr pattern to a String pattern. The pattern is escaped /// if -F/--fixed-strings is set. /// /// If the pattern is not valid UTF-8, then an error is returned. fn pattern_from_os_str(&self, pat: &OsStr) -> Result { let s = cli::pattern_from_os(pat)?; Ok(self.pattern_from_str(s)) } /// Converts a &str pattern to a String pattern. The pattern is escaped /// if -F/--fixed-strings is set. fn pattern_from_str(&self, pat: &str) -> String { self.pattern_from_string(pat.to_string()) } /// Applies additional processing on the given pattern if necessary /// (such as escaping meta characters or turning it into a line regex). fn pattern_from_string(&self, pat: String) -> String { let pat = self.pattern_line(self.pattern_literal(pat)); if pat.is_empty() { self.pattern_empty() } else { pat } } /// Returns the given pattern as a line pattern if the -x/--line-regexp /// flag is set. Otherwise, the pattern is returned unchanged. fn pattern_line(&self, pat: String) -> String { if self.is_present("line-regexp") { format!(r"^(?:{})$", pat) } else { pat } } /// Returns the given pattern as a literal pattern if the /// -F/--fixed-strings flag is set. Otherwise, the pattern is returned /// unchanged. fn pattern_literal(&self, pat: String) -> String { if self.is_present("fixed-strings") { regex::escape(&pat) } else { pat } } /// Returns the preprocessor command if one was specified. fn preprocessor(&self) -> Option { let path = match self.value_of_os("pre") { None => return None, Some(path) => path, }; if path.is_empty() { return None; } Some(Path::new(path).to_path_buf()) } /// Builds the set of globs for filtering files to apply to the --pre /// flag. If no --pre-globs are available, then this always returns an /// empty set of globs. fn preprocessor_globs(&self) -> Result { let mut builder = OverrideBuilder::new(env::current_dir()?); for glob in self.values_of_lossy_vec("pre-glob") { builder.add(&glob)?; } Ok(builder.build()?) } /// Parse the regex-size-limit argument option into a byte count. fn regex_size_limit(&self) -> Result> { let r = self.parse_human_readable_size("regex-size-limit")?; u64_to_usize("regex-size-limit", r) } /// Returns the replacement string as UTF-8 bytes if it exists. fn replacement(&self) -> Option> { self.value_of_lossy("replace").map(|s| s.into_bytes()) } /// Returns the sorting criteria based on command line parameters. fn sort_by(&self) -> Result { // For backcompat, continue supporting deprecated --sort-files flag. if self.is_present("sort-files") { return Ok(SortBy::asc(SortByKind::Path)); } let sortby = match self.value_of_lossy("sort") { None => match self.value_of_lossy("sortr") { None => return Ok(SortBy::none()), Some(choice) => SortBy::desc(SortByKind::new(&choice)), } Some(choice) => SortBy::asc(SortByKind::new(&choice)), }; Ok(sortby) } /// Returns true if and only if aggregate statistics for a search should /// be tracked. /// /// Generally, this is only enabled when explicitly requested by in the /// command line arguments via the --stats flag, but this can also be /// enabled implicity via the output format, e.g., for JSON Lines. fn stats(&self) -> bool { self.output_kind() == OutputKind::JSON || self.is_present("stats") } /// When the output format is `Summary`, this returns the type of summary /// output to show. /// /// This returns `None` if the output format is not `Summary`. fn summary_kind(&self) -> Option { let (count, count_matches) = self.counts(); if self.is_present("quiet") { Some(SummaryKind::Quiet) } else if count_matches { Some(SummaryKind::CountMatches) } else if count { Some(SummaryKind::Count) } else if self.is_present("files-with-matches") { Some(SummaryKind::PathWithMatch) } else if self.is_present("files-without-match") { Some(SummaryKind::PathWithoutMatch) } else { None } } /// Return the number of threads that should be used for parallelism. fn threads(&self) -> Result { if self.sort_by()?.kind != SortByKind::None { return Ok(1); } let threads = self.usize_of("threads")?.unwrap_or(0); Ok(if threads == 0 { cmp::min(12, num_cpus::get()) } else { threads }) } /// Builds a file type matcher from the command line flags. fn types(&self) -> Result { let mut builder = TypesBuilder::new(); builder.add_defaults(); for ty in self.values_of_lossy_vec("type-clear") { builder.clear(&ty); } for def in self.values_of_lossy_vec("type-add") { builder.add_def(&def)?; } for ty in self.values_of_lossy_vec("type") { builder.select(&ty); } for ty in self.values_of_lossy_vec("type-not") { builder.negate(&ty); } builder.build().map_err(From::from) } /// Returns the number of times the `unrestricted` flag is provided. fn unrestricted_count(&self) -> u64 { self.occurrences_of("unrestricted") } /// Returns true if and only if PCRE2's Unicode mode should be enabled. fn pcre2_unicode(&self) -> bool { // PCRE2 Unicode is enabled by default, so only disable it when told // to do so explicitly. self.is_present("pcre2") && !self.is_present("no-pcre2-unicode") } /// Returns true if and only if file names containing each match should /// be emitted. fn with_filename(&self, paths: &[PathBuf]) -> bool { if self.is_present("no-filename") { false } else { let path_stdin = Path::new("-"); self.is_present("with-filename") || self.is_present("vimgrep") || paths.len() > 1 || paths.get(0).map_or(false, |p| p != path_stdin && p.is_dir()) } } } /// Lower level generic helper methods for teasing values out of clap. impl ArgMatches { /// Like values_of_lossy, but returns an empty vec if the flag is not /// present. fn values_of_lossy_vec(&self, name: &str) -> Vec { self.values_of_lossy(name).unwrap_or_else(Vec::new) } /// Safely reads an arg value with the given name, and if it's present, /// tries to parse it as a usize value. /// /// If the number is zero, then it is considered absent and `None` is /// returned. fn usize_of_nonzero(&self, name: &str) -> Result> { let n = match self.usize_of(name)? { None => return Ok(None), Some(n) => n, }; Ok(if n == 0 { None } else { Some(n) }) } /// Safely reads an arg value with the given name, and if it's present, /// tries to parse it as a usize value. fn usize_of(&self, name: &str) -> Result> { match self.value_of_lossy(name) { None => Ok(None), Some(v) => v.parse().map(Some).map_err(From::from), } } /// Parses an argument of the form `[0-9]+(KMG)?`. /// /// If the aforementioned format is not recognized, then this returns an /// error. fn parse_human_readable_size( &self, arg_name: &str, ) -> Result> { let size = match self.value_of_lossy(arg_name) { None => return Ok(None), Some(size) => size, }; Ok(Some(cli::parse_human_readable_size(&size)?)) } } /// The following methods mostly dispatch to the underlying clap methods /// directly. Methods that would otherwise get a single value will fetch all /// values and return the last one. (Clap returns the first one.) We only /// define the ones we need. impl ArgMatches { fn is_present(&self, name: &str) -> bool { self.0.is_present(name) } fn occurrences_of(&self, name: &str) -> u64 { self.0.occurrences_of(name) } fn value_of_lossy(&self, name: &str) -> Option { self.0.value_of_lossy(name).map(|s| s.into_owned()) } fn values_of_lossy(&self, name: &str) -> Option> { self.0.values_of_lossy(name) } fn value_of_os(&self, name: &str) -> Option<&OsStr> { self.0.value_of_os(name) } fn values_of_os(&self, name: &str) -> Option { self.0.values_of_os(name) } } /// Inspect an error resulting from building a Rust regex matcher, and if it's /// believed to correspond to a syntax error that PCRE2 could handle, then /// add a message to suggest the use of -P/--pcre2. #[cfg(feature = "pcre2")] fn suggest_pcre2(msg: String) -> String { if !msg.contains("backreferences") && !msg.contains("look-around") { msg } else { format!("{} Consider enabling PCRE2 with the --pcre2 flag, which can handle backreferences and look-around.", msg) } } fn suggest_multiline(msg: String) -> String { if msg.contains("the literal") && msg.contains("not allowed") { format!("{} Consider enabling multiline mode with the --multiline flag (or -U for short). When multiline mode is enabled, new line characters can be matched.", msg) } else { msg } } /// Convert the result of parsing a human readable file size to a `usize`, /// failing if the type does not fit. fn u64_to_usize( arg_name: &str, value: Option, ) -> Result> { use std::usize; let value = match value { None => return Ok(None), Some(value) => value, }; if value <= usize::MAX as u64 { Ok(Some(value as usize)) } else { Err(From::from(format!("number too large for {}", arg_name))) } } /// Builds a comparator for sorting two files according to a system time /// extracted from the file's metadata. /// /// If there was a problem extracting the metadata or if the time is not /// available, then both entries compare equal. fn sort_by_metadata_time( p1: &Path, p2: &Path, reverse: bool, get_time: G, ) -> cmp::Ordering where G: Fn(&fs::Metadata) -> io::Result { let t1 = match p1.metadata().and_then(|md| get_time(&md)) { Ok(t) => t, Err(_) => return cmp::Ordering::Equal, }; let t2 = match p2.metadata().and_then(|md| get_time(&md)) { Ok(t) => t, Err(_) => return cmp::Ordering::Equal, }; if reverse { t1.cmp(&t2).reverse() } else { t1.cmp(&t2) } } /// Returns a clap matches object if the given arguments parse successfully. /// /// Otherwise, if an error occurred, then it is returned unless the error /// corresponds to a `--help` or `--version` request. In which case, the /// corresponding output is printed and the current process is exited /// successfully. fn clap_matches( args: I, ) -> Result> where I: IntoIterator, T: Into + Clone { let err = match app::app().get_matches_from_safe(args) { Ok(matches) => return Ok(matches), Err(err) => err, }; if err.use_stderr() { return Err(err.into()); } // Explicitly ignore any error returned by write!. The most likely error // at this point is a broken pipe error, in which case, we want to ignore // it and exit quietly. // // (This is the point of this helper function. clap's functionality for // doing this will panic on a broken pipe error.) let _ = write!(io::stdout(), "{}", err); process::exit(0); } ripgrep-11.0.2/src/config.rs010064400017500000144000000105621352065255400140750ustar0000000000000000// This module provides routines for reading ripgrep config "rc" files. The // primary output of these routines is a sequence of arguments, where each // argument corresponds precisely to one shell argument. use std::env; use std::error::Error; use std::fs::File; use std::io; use std::ffi::OsString; use std::path::{Path, PathBuf}; use bstr::{io::BufReadExt, ByteSlice}; use log; use crate::Result; /// Return a sequence of arguments derived from ripgrep rc configuration files. pub fn args() -> Vec { let config_path = match env::var_os("RIPGREP_CONFIG_PATH") { None => return vec![], Some(config_path) => { if config_path.is_empty() { return vec![]; } PathBuf::from(config_path) } }; let (args, errs) = match parse(&config_path) { Ok((args, errs)) => (args, errs), Err(err) => { message!("{}", err); return vec![]; } }; if !errs.is_empty() { for err in errs { message!("{}:{}", config_path.display(), err); } } log::debug!( "{}: arguments loaded from config file: {:?}", config_path.display(), args ); args } /// Parse a single ripgrep rc file from the given path. /// /// On success, this returns a set of shell arguments, in order, that should /// be pre-pended to the arguments given to ripgrep at the command line. /// /// If the file could not be read, then an error is returned. If there was /// a problem parsing one or more lines in the file, then errors are returned /// for each line in addition to successfully parsed arguments. fn parse>( path: P, ) -> Result<(Vec, Vec>)> { let path = path.as_ref(); match File::open(&path) { Ok(file) => parse_reader(file), Err(err) => Err(From::from(format!("{}: {}", path.display(), err))), } } /// Parse a single ripgrep rc file from the given reader. /// /// Callers should not provided a buffered reader, as this routine will use its /// own buffer internally. /// /// On success, this returns a set of shell arguments, in order, that should /// be pre-pended to the arguments given to ripgrep at the command line. /// /// If the reader could not be read, then an error is returned. If there was a /// problem parsing one or more lines, then errors are returned for each line /// in addition to successfully parsed arguments. fn parse_reader( rdr: R, ) -> Result<(Vec, Vec>)> { let bufrdr = io::BufReader::new(rdr); let (mut args, mut errs) = (vec![], vec![]); let mut line_number = 0; bufrdr.for_byte_line_with_terminator(|line| { line_number += 1; let line = line.trim(); if line.is_empty() || line[0] == b'#' { return Ok(true); } match line.to_os_str() { Ok(osstr) => { args.push(osstr.to_os_string()); } Err(err) => { errs.push(format!("{}: {}", line_number, err).into()); } } Ok(true) })?; Ok((args, errs)) } #[cfg(test)] mod tests { use std::ffi::OsString; use super::parse_reader; #[test] fn basic() { let (args, errs) = parse_reader(&b"\ # Test --context=0 --smart-case -u # --bar --foo "[..]).unwrap(); assert!(errs.is_empty()); let args: Vec = args.into_iter().map(|s| s.into_string().unwrap()).collect(); assert_eq!(args, vec![ "--context=0", "--smart-case", "-u", "--foo", ]); } // We test that we can handle invalid UTF-8 on Unix-like systems. #[test] #[cfg(unix)] fn error() { use std::os::unix::ffi::OsStringExt; let (args, errs) = parse_reader(&b"\ quux foo\xFFbar baz "[..]).unwrap(); assert!(errs.is_empty()); assert_eq!(args, vec![ OsString::from("quux"), OsString::from_vec(b"foo\xFFbar".to_vec()), OsString::from("baz"), ]); } // ... but test that invalid UTF-8 fails on Windows. #[test] #[cfg(not(unix))] fn error() { let (args, errs) = parse_reader(&b"\ quux foo\xFFbar baz "[..]).unwrap(); assert_eq!(errs.len(), 1); assert_eq!(args, vec![ OsString::from("quux"), OsString::from("baz"), ]); } } ripgrep-11.0.2/src/logger.rs010064400017500000144000000037371352064771400141170ustar0000000000000000// This module defines a super simple logger that works with the `log` crate. // We don't need anything fancy; just basic log levels and the ability to // print to stderr. We therefore avoid bringing in extra dependencies just // for this functionality. use log::{self, Log}; /// The simplest possible logger that logs to stderr. /// /// This logger does no filtering. Instead, it relies on the `log` crates /// filtering via its global max_level setting. #[derive(Debug)] pub struct Logger(()); const LOGGER: &'static Logger = &Logger(()); impl Logger { /// Create a new logger that logs to stderr and initialize it as the /// global logger. If there was a problem setting the logger, then an /// error is returned. pub fn init() -> Result<(), log::SetLoggerError> { log::set_logger(LOGGER) } } impl Log for Logger { fn enabled(&self, _: &log::Metadata) -> bool { // We set the log level via log::set_max_level, so we don't need to // implement filtering here. true } fn log(&self, record: &log::Record) { match (record.file(), record.line()) { (Some(file), Some(line)) => { eprintln!( "{}|{}|{}:{}: {}", record.level(), record.target(), file, line, record.args() ); } (Some(file), None) => { eprintln!( "{}|{}|{}: {}", record.level(), record.target(), file, record.args() ); } _ => { eprintln!( "{}|{}: {}", record.level(), record.target(), record.args() ); } } } fn flush(&self) { // We use eprintln! which is flushed on every call. } } ripgrep-11.0.2/src/main.rs010064400017500000144000000263461352065255400135630ustar0000000000000000use std::error; use std::io::{self, Write}; use std::process; use std::sync::{Arc, Mutex}; use std::time::Instant; use ignore::WalkState; use args::Args; use subject::Subject; #[macro_use] mod messages; mod app; mod args; mod config; mod logger; mod path_printer; mod search; mod subject; // Since Rust no longer uses jemalloc by default, ripgrep will, by default, // use the system allocator. On Linux, this would normally be glibc's // allocator, which is pretty good. In particular, ripgrep does not have a // particularly allocation heavy workload, so there really isn't much // difference (for ripgrep's purposes) between glibc's allocator and jemalloc. // // However, when ripgrep is built with musl, this means ripgrep will use musl's // allocator, which appears to be substantially worse. (musl's goal is not to // have the fastest version of everything. Its goal is to be small and amenable // to static compilation.) Even though ripgrep isn't particularly allocation // heavy, musl's allocator appears to slow down ripgrep quite a bit. Therefore, // when building with musl, we use jemalloc. // // We don't unconditionally use jemalloc because it can be nice to use the // system's default allocator by default. Moreover, jemalloc seems to increase // compilation times by a bit. // // Moreover, we only do this on 64-bit systems since jemalloc doesn't support // i686. #[cfg(all(target_env = "musl", target_pointer_width = "64"))] #[global_allocator] static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc; type Result = ::std::result::Result>; fn main() { if let Err(err) = Args::parse().and_then(try_main) { eprintln!("{}", err); process::exit(2); } } fn try_main(args: Args) -> Result<()> { use args::Command::*; let matched = match args.command()? { Search => search(&args), SearchParallel => search_parallel(&args), SearchNever => Ok(false), Files => files(&args), FilesParallel => files_parallel(&args), Types => types(&args), PCRE2Version => pcre2_version(&args), }?; if matched && (args.quiet() || !messages::errored()) { process::exit(0) } else if messages::errored() { process::exit(2) } else { process::exit(1) } } /// The top-level entry point for single-threaded search. This recursively /// steps through the file list (current directory by default) and searches /// each file sequentially. fn search(args: &Args) -> Result { let started_at = Instant::now(); let quit_after_match = args.quit_after_match()?; let subject_builder = args.subject_builder(); let mut stats = args.stats()?; let mut searcher = args.search_worker(args.stdout())?; let mut matched = false; for result in args.walker()? { let subject = match subject_builder.build_from_result(result) { Some(subject) => subject, None => continue, }; let search_result = match searcher.search(&subject) { Ok(search_result) => search_result, Err(err) => { // A broken pipe means graceful termination. if err.kind() == io::ErrorKind::BrokenPipe { break; } err_message!("{}: {}", subject.path().display(), err); continue; } }; matched = matched || search_result.has_match(); if let Some(ref mut stats) = stats { *stats += search_result.stats().unwrap(); } if matched && quit_after_match { break; } } if let Some(ref stats) = stats { let elapsed = Instant::now().duration_since(started_at); // We don't care if we couldn't print this successfully. let _ = searcher.print_stats(elapsed, stats); } Ok(matched) } /// The top-level entry point for multi-threaded search. The parallelism is /// itself achieved by the recursive directory traversal. All we need to do is /// feed it a worker for performing a search on each file. fn search_parallel(args: &Args) -> Result { use std::sync::atomic::AtomicBool; use std::sync::atomic::Ordering::SeqCst; let quit_after_match = args.quit_after_match()?; let started_at = Instant::now(); let subject_builder = Arc::new(args.subject_builder()); let bufwtr = Arc::new(args.buffer_writer()?); let stats = Arc::new(args.stats()?.map(Mutex::new)); let matched = Arc::new(AtomicBool::new(false)); let mut searcher_err = None; args.walker_parallel()?.run(|| { let args = args.clone(); let bufwtr = Arc::clone(&bufwtr); let stats = Arc::clone(&stats); let matched = Arc::clone(&matched); let subject_builder = Arc::clone(&subject_builder); let mut searcher = match args.search_worker(bufwtr.buffer()) { Ok(searcher) => searcher, Err(err) => { searcher_err = Some(err); return Box::new(move |_| { WalkState::Quit }); } }; Box::new(move |result| { let subject = match subject_builder.build_from_result(result) { Some(subject) => subject, None => return WalkState::Continue, }; searcher.printer().get_mut().clear(); let search_result = match searcher.search(&subject) { Ok(search_result) => search_result, Err(err) => { err_message!("{}: {}", subject.path().display(), err); return WalkState::Continue; } }; if search_result.has_match() { matched.store(true, SeqCst); } if let Some(ref locked_stats) = *stats { let mut stats = locked_stats.lock().unwrap(); *stats += search_result.stats().unwrap(); } if let Err(err) = bufwtr.print(searcher.printer().get_mut()) { // A broken pipe means graceful termination. if err.kind() == io::ErrorKind::BrokenPipe { return WalkState::Quit; } // Otherwise, we continue on our merry way. err_message!("{}: {}", subject.path().display(), err); } if matched.load(SeqCst) && quit_after_match { WalkState::Quit } else { WalkState::Continue } }) }); if let Some(err) = searcher_err.take() { return Err(err); } if let Some(ref locked_stats) = *stats { let elapsed = Instant::now().duration_since(started_at); let stats = locked_stats.lock().unwrap(); let mut searcher = args.search_worker(args.stdout())?; // We don't care if we couldn't print this successfully. let _ = searcher.print_stats(elapsed, &stats); } Ok(matched.load(SeqCst)) } /// The top-level entry point for listing files without searching them. This /// recursively steps through the file list (current directory by default) and /// prints each path sequentially using a single thread. fn files(args: &Args) -> Result { let quit_after_match = args.quit_after_match()?; let subject_builder = args.subject_builder(); let mut matched = false; let mut path_printer = args.path_printer(args.stdout())?; for result in args.walker()? { let subject = match subject_builder.build_from_result(result) { Some(subject) => subject, None => continue, }; matched = true; if quit_after_match { break; } if let Err(err) = path_printer.write_path(subject.path()) { // A broken pipe means graceful termination. if err.kind() == io::ErrorKind::BrokenPipe { break; } // Otherwise, we have some other error that's preventing us from // writing to stdout, so we should bubble it up. return Err(err.into()); } } Ok(matched) } /// The top-level entry point for listing files without searching them. This /// recursively steps through the file list (current directory by default) and /// prints each path sequentially using multiple threads. fn files_parallel(args: &Args) -> Result { use std::sync::atomic::AtomicBool; use std::sync::atomic::Ordering::SeqCst; use std::sync::mpsc; use std::thread; let quit_after_match = args.quit_after_match()?; let subject_builder = Arc::new(args.subject_builder()); let mut path_printer = args.path_printer(args.stdout())?; let matched = Arc::new(AtomicBool::new(false)); let (tx, rx) = mpsc::channel::(); let print_thread = thread::spawn(move || -> io::Result<()> { for subject in rx.iter() { path_printer.write_path(subject.path())?; } Ok(()) }); args.walker_parallel()?.run(|| { let subject_builder = Arc::clone(&subject_builder); let matched = Arc::clone(&matched); let tx = tx.clone(); Box::new(move |result| { let subject = match subject_builder.build_from_result(result) { Some(subject) => subject, None => return WalkState::Continue, }; matched.store(true, SeqCst); if quit_after_match { WalkState::Quit } else { match tx.send(subject) { Ok(_) => WalkState::Continue, Err(_) => WalkState::Quit, } } }) }); drop(tx); if let Err(err) = print_thread.join().unwrap() { // A broken pipe means graceful termination, so fall through. // Otherwise, something bad happened while writing to stdout, so bubble // it up. if err.kind() != io::ErrorKind::BrokenPipe { return Err(err.into()); } } Ok(matched.load(SeqCst)) } /// The top-level entry point for --type-list. fn types(args: &Args) -> Result { let mut count = 0; let mut stdout = args.stdout(); for def in args.type_defs()? { count += 1; stdout.write_all(def.name().as_bytes())?; stdout.write_all(b": ")?; let mut first = true; for glob in def.globs() { if !first { stdout.write_all(b", ")?; } stdout.write_all(glob.as_bytes())?; first = false; } stdout.write_all(b"\n")?; } Ok(count > 0) } /// The top-level entry point for --pcre2-version. fn pcre2_version(args: &Args) -> Result { #[cfg(feature = "pcre2")] fn imp(args: &Args) -> Result { use grep::pcre2; let mut stdout = args.stdout(); let (major, minor) = pcre2::version(); writeln!(stdout, "PCRE2 {}.{} is available", major, minor)?; if cfg!(target_pointer_width = "64") && pcre2::is_jit_available() { writeln!(stdout, "JIT is available")?; } Ok(true) } #[cfg(not(feature = "pcre2"))] fn imp(args: &Args) -> Result { let mut stdout = args.stdout(); writeln!(stdout, "PCRE2 is not available in this build of ripgrep.")?; Ok(false) } imp(args) } ripgrep-11.0.2/src/messages.rs010064400017500000144000000040211351372666500144370ustar0000000000000000use std::sync::atomic::{AtomicBool, Ordering}; static MESSAGES: AtomicBool = AtomicBool::new(false); static IGNORE_MESSAGES: AtomicBool = AtomicBool::new(false); static ERRORED: AtomicBool = AtomicBool::new(false); /// Emit a non-fatal error message, unless messages were disabled. #[macro_export] macro_rules! message { ($($tt:tt)*) => { if crate::messages::messages() { eprintln!($($tt)*); } } } /// Like message, but sets ripgrep's "errored" flag, which controls the exit /// status. #[macro_export] macro_rules! err_message { ($($tt:tt)*) => { crate::messages::set_errored(); message!($($tt)*); } } /// Emit a non-fatal ignore-related error message (like a parse error), unless /// ignore-messages were disabled. #[macro_export] macro_rules! ignore_message { ($($tt:tt)*) => { if crate::messages::messages() && crate::messages::ignore_messages() { eprintln!($($tt)*); } } } /// Returns true if and only if messages should be shown. pub fn messages() -> bool { MESSAGES.load(Ordering::SeqCst) } /// Set whether messages should be shown or not. /// /// By default, they are not shown. pub fn set_messages(yes: bool) { MESSAGES.store(yes, Ordering::SeqCst) } /// Returns true if and only if "ignore" related messages should be shown. pub fn ignore_messages() -> bool { IGNORE_MESSAGES.load(Ordering::SeqCst) } /// Set whether "ignore" related messages should be shown or not. /// /// By default, they are not shown. /// /// Note that this is overridden if `messages` is disabled. Namely, if /// `messages` is disabled, then "ignore" messages are never shown, regardless /// of this setting. pub fn set_ignore_messages(yes: bool) { IGNORE_MESSAGES.store(yes, Ordering::SeqCst) } /// Returns true if and only if ripgrep came across a non-fatal error. pub fn errored() -> bool { ERRORED.load(Ordering::SeqCst) } /// Indicate that ripgrep has come across a non-fatal error. pub fn set_errored() { ERRORED.store(true, Ordering::SeqCst); } ripgrep-11.0.2/src/path_printer.rs010064400017500000144000000053561352064771400153360ustar0000000000000000use std::io; use std::path::Path; use grep::printer::{ColorSpecs, PrinterPath}; use termcolor::WriteColor; /// A configuration for describing how paths should be written. #[derive(Clone, Debug)] struct Config { colors: ColorSpecs, separator: Option, terminator: u8, } impl Default for Config { fn default() -> Config { Config { colors: ColorSpecs::default(), separator: None, terminator: b'\n', } } } /// A builder for constructing things to search over. #[derive(Clone, Debug)] pub struct PathPrinterBuilder { config: Config, } impl PathPrinterBuilder { /// Return a new subject builder with a default configuration. pub fn new() -> PathPrinterBuilder { PathPrinterBuilder { config: Config::default() } } /// Create a new path printer with the current configuration that writes /// paths to the given writer. pub fn build(&self, wtr: W) -> PathPrinter { PathPrinter { config: self.config.clone(), wtr: wtr, } } /// Set the color specification for this printer. /// /// Currently, only the `path` component of the given specification is /// used. pub fn color_specs( &mut self, specs: ColorSpecs, ) -> &mut PathPrinterBuilder { self.config.colors = specs; self } /// A path separator. /// /// When provided, the path's default separator will be replaced with /// the given separator. /// /// This is not set by default, and the system's default path separator /// will be used. pub fn separator(&mut self, sep: Option) -> &mut PathPrinterBuilder { self.config.separator = sep; self } /// A path terminator. /// /// When printing a path, it will be by terminated by the given byte. /// /// This is set to `\n` by default. pub fn terminator(&mut self, terminator: u8) -> &mut PathPrinterBuilder { self.config.terminator = terminator; self } } /// A printer for emitting paths to a writer, with optional color support. #[derive(Debug)] pub struct PathPrinter { config: Config, wtr: W, } impl PathPrinter { /// Write the given path to the underlying writer. pub fn write_path(&mut self, path: &Path) -> io::Result<()> { let ppath = PrinterPath::with_separator(path, self.config.separator); if !self.wtr.supports_color() { self.wtr.write_all(ppath.as_bytes())?; } else { self.wtr.set_color(self.config.colors.path())?; self.wtr.write_all(ppath.as_bytes())?; self.wtr.reset()?; } self.wtr.write_all(&[self.config.terminator]) } } ripgrep-11.0.2/src/search.rs010064400017500000144000000432651352065255400141030ustar0000000000000000use std::fs::File; use std::io; use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; use std::time::Duration; use grep::cli; use grep::matcher::Matcher; #[cfg(feature = "pcre2")] use grep::pcre2::{RegexMatcher as PCRE2RegexMatcher}; use grep::printer::{JSON, Standard, Summary, Stats}; use grep::regex::{RegexMatcher as RustRegexMatcher}; use grep::searcher::{BinaryDetection, Searcher}; use ignore::overrides::Override; use serde_json as json; use serde_json::json; use termcolor::WriteColor; use crate::subject::Subject; /// The configuration for the search worker. Among a few other things, the /// configuration primarily controls the way we show search results to users /// at a very high level. #[derive(Clone, Debug)] struct Config { json_stats: bool, preprocessor: Option, preprocessor_globs: Override, search_zip: bool, binary_implicit: BinaryDetection, binary_explicit: BinaryDetection, } impl Default for Config { fn default() -> Config { Config { json_stats: false, preprocessor: None, preprocessor_globs: Override::empty(), search_zip: false, binary_implicit: BinaryDetection::none(), binary_explicit: BinaryDetection::none(), } } } /// A builder for configuring and constructing a search worker. #[derive(Clone, Debug)] pub struct SearchWorkerBuilder { config: Config, command_builder: cli::CommandReaderBuilder, decomp_builder: cli::DecompressionReaderBuilder, } impl Default for SearchWorkerBuilder { fn default() -> SearchWorkerBuilder { SearchWorkerBuilder::new() } } impl SearchWorkerBuilder { /// Create a new builder for configuring and constructing a search worker. pub fn new() -> SearchWorkerBuilder { let mut cmd_builder = cli::CommandReaderBuilder::new(); cmd_builder.async_stderr(true); let mut decomp_builder = cli::DecompressionReaderBuilder::new(); decomp_builder.async_stderr(true); SearchWorkerBuilder { config: Config::default(), command_builder: cmd_builder, decomp_builder: decomp_builder, } } /// Create a new search worker using the given searcher, matcher and /// printer. pub fn build( &self, matcher: PatternMatcher, searcher: Searcher, printer: Printer, ) -> SearchWorker { let config = self.config.clone(); let command_builder = self.command_builder.clone(); let decomp_builder = self.decomp_builder.clone(); SearchWorker { config, command_builder, decomp_builder, matcher, searcher, printer, } } /// Forcefully use JSON to emit statistics, even if the underlying printer /// is not the JSON printer. /// /// This is useful for implementing flag combinations like /// `--json --quiet`, which uses the summary printer for implementing /// `--quiet` but still wants to emit summary statistics, which should /// be JSON formatted because of the `--json` flag. pub fn json_stats(&mut self, yes: bool) -> &mut SearchWorkerBuilder { self.config.json_stats = yes; self } /// Set the path to a preprocessor command. /// /// When this is set, instead of searching files directly, the given /// command will be run with the file path as the first argument, and the /// output of that command will be searched instead. pub fn preprocessor( &mut self, cmd: Option, ) -> &mut SearchWorkerBuilder { self.config.preprocessor = cmd; self } /// Set the globs for determining which files should be run through the /// preprocessor. By default, with no globs and a preprocessor specified, /// every file is run through the preprocessor. pub fn preprocessor_globs( &mut self, globs: Override, ) -> &mut SearchWorkerBuilder { self.config.preprocessor_globs = globs; self } /// Enable the decompression and searching of common compressed files. /// /// When enabled, if a particular file path is recognized as a compressed /// file, then it is decompressed before searching. /// /// Note that if a preprocessor command is set, then it overrides this /// setting. pub fn search_zip(&mut self, yes: bool) -> &mut SearchWorkerBuilder { self.config.search_zip = yes; self } /// Set the binary detection that should be used when searching files /// found via a recursive directory search. /// /// Generally, this binary detection may be `BinaryDetection::quit` if /// we want to skip binary files completely. /// /// By default, no binary detection is performed. pub fn binary_detection_implicit( &mut self, detection: BinaryDetection, ) -> &mut SearchWorkerBuilder { self.config.binary_implicit = detection; self } /// Set the binary detection that should be used when searching files /// explicitly supplied by an end user. /// /// Generally, this binary detection should NOT be `BinaryDetection::quit`, /// since we never want to automatically filter files supplied by the end /// user. /// /// By default, no binary detection is performed. pub fn binary_detection_explicit( &mut self, detection: BinaryDetection, ) -> &mut SearchWorkerBuilder { self.config.binary_explicit = detection; self } } /// The result of executing a search. /// /// Generally speaking, the "result" of a search is sent to a printer, which /// writes results to an underlying writer such as stdout or a file. However, /// every search also has some aggregate statistics or meta data that may be /// useful to higher level routines. #[derive(Clone, Debug, Default)] pub struct SearchResult { has_match: bool, stats: Option, } impl SearchResult { /// Whether the search found a match or not. pub fn has_match(&self) -> bool { self.has_match } /// Return aggregate search statistics for a single search, if available. /// /// It can be expensive to compute statistics, so these are only present /// if explicitly enabled in the printer provided by the caller. pub fn stats(&self) -> Option<&Stats> { self.stats.as_ref() } } /// The pattern matcher used by a search worker. #[derive(Clone, Debug)] pub enum PatternMatcher { RustRegex(RustRegexMatcher), #[cfg(feature = "pcre2")] PCRE2(PCRE2RegexMatcher), } /// The printer used by a search worker. /// /// The `W` type parameter refers to the type of the underlying writer. #[derive(Debug)] pub enum Printer { /// Use the standard printer, which supports the classic grep-like format. Standard(Standard), /// Use the summary printer, which supports aggregate displays of search /// results. Summary(Summary), /// A JSON printer, which emits results in the JSON Lines format. JSON(JSON), } impl Printer { fn print_stats( &mut self, total_duration: Duration, stats: &Stats, ) -> io::Result<()> { match *self { Printer::JSON(_) => { self.print_stats_json(total_duration, stats) } Printer::Standard(_) | Printer::Summary(_) => { self.print_stats_human(total_duration, stats) } } } fn print_stats_human( &mut self, total_duration: Duration, stats: &Stats, ) -> io::Result<()> { write!( self.get_mut(), " {matches} matches {lines} matched lines {searches_with_match} files contained matches {searches} files searched {bytes_printed} bytes printed {bytes_searched} bytes searched {search_time:0.6} seconds spent searching {process_time:0.6} seconds ", matches = stats.matches(), lines = stats.matched_lines(), searches_with_match = stats.searches_with_match(), searches = stats.searches(), bytes_printed = stats.bytes_printed(), bytes_searched = stats.bytes_searched(), search_time = fractional_seconds(stats.elapsed()), process_time = fractional_seconds(total_duration) ) } fn print_stats_json( &mut self, total_duration: Duration, stats: &Stats, ) -> io::Result<()> { // We specifically match the format laid out by the JSON printer in // the grep-printer crate. We simply "extend" it with the 'summary' // message type. let fractional = fractional_seconds(total_duration); json::to_writer(self.get_mut(), &json!({ "type": "summary", "data": { "stats": stats, "elapsed_total": { "secs": total_duration.as_secs(), "nanos": total_duration.subsec_nanos(), "human": format!("{:0.6}s", fractional), }, } }))?; write!(self.get_mut(), "\n") } /// Return a mutable reference to the underlying printer's writer. pub fn get_mut(&mut self) -> &mut W { match *self { Printer::Standard(ref mut p) => p.get_mut(), Printer::Summary(ref mut p) => p.get_mut(), Printer::JSON(ref mut p) => p.get_mut(), } } } /// A worker for executing searches. /// /// It is intended for a single worker to execute many searches, and is /// generally intended to be used from a single thread. When searching using /// multiple threads, it is better to create a new worker for each thread. #[derive(Debug)] pub struct SearchWorker { config: Config, command_builder: cli::CommandReaderBuilder, decomp_builder: cli::DecompressionReaderBuilder, matcher: PatternMatcher, searcher: Searcher, printer: Printer, } impl SearchWorker { /// Execute a search over the given subject. pub fn search(&mut self, subject: &Subject) -> io::Result { let bin = if subject.is_explicit() { self.config.binary_explicit.clone() } else { self.config.binary_implicit.clone() }; self.searcher.set_binary_detection(bin); let path = subject.path(); if subject.is_stdin() { self.search_reader(path, io::stdin().lock()) } else if self.should_preprocess(path) { self.search_preprocessor(path) } else if self.should_decompress(path) { self.search_decompress(path) } else { self.search_path(path) } } /// Return a mutable reference to the underlying printer. pub fn printer(&mut self) -> &mut Printer { &mut self.printer } /// Print the given statistics to the underlying writer in a way that is /// consistent with this searcher's printer's format. /// /// While `Stats` contains a duration itself, this only corresponds to the /// time spent searching, where as `total_duration` should roughly /// approximate the lifespan of the ripgrep process itself. pub fn print_stats( &mut self, total_duration: Duration, stats: &Stats, ) -> io::Result<()> { if self.config.json_stats { self.printer().print_stats_json(total_duration, stats) } else { self.printer().print_stats(total_duration, stats) } } /// Returns true if and only if the given file path should be /// decompressed before searching. fn should_decompress(&self, path: &Path) -> bool { if !self.config.search_zip { return false; } self.decomp_builder.get_matcher().has_command(path) } /// Returns true if and only if the given file path should be run through /// the preprocessor. fn should_preprocess(&self, path: &Path) -> bool { if !self.config.preprocessor.is_some() { return false; } if self.config.preprocessor_globs.is_empty() { return true; } !self.config.preprocessor_globs.matched(path, false).is_ignore() } /// Search the given file path by first asking the preprocessor for the /// data to search instead of opening the path directly. fn search_preprocessor( &mut self, path: &Path, ) -> io::Result { let bin = self.config.preprocessor.as_ref().unwrap(); let mut cmd = Command::new(bin); cmd.arg(path).stdin(Stdio::from(File::open(path)?)); let rdr = self .command_builder .build(&mut cmd) .map_err(|err| { io::Error::new( io::ErrorKind::Other, format!( "preprocessor command could not start: '{:?}': {}", cmd, err, ), ) })?; self.search_reader(path, rdr).map_err(|err| { io::Error::new( io::ErrorKind::Other, format!("preprocessor command failed: '{:?}': {}", cmd, err), ) }) } /// Attempt to decompress the data at the given file path and search the /// result. If the given file path isn't recognized as a compressed file, /// then search it without doing any decompression. fn search_decompress( &mut self, path: &Path, ) -> io::Result { let rdr = self.decomp_builder.build(path)?; self.search_reader(path, rdr) } /// Search the contents of the given file path. fn search_path(&mut self, path: &Path) -> io::Result { use self::PatternMatcher::*; let (searcher, printer) = (&mut self.searcher, &mut self.printer); match self.matcher { RustRegex(ref m) => search_path(m, searcher, printer, path), #[cfg(feature = "pcre2")] PCRE2(ref m) => search_path(m, searcher, printer, path), } } /// Executes a search on the given reader, which may or may not correspond /// directly to the contents of the given file path. Instead, the reader /// may actually cause something else to be searched (for example, when /// a preprocessor is set or when decompression is enabled). In those /// cases, the file path is used for visual purposes only. /// /// Generally speaking, this method should only be used when there is no /// other choice. Searching via `search_path` provides more opportunities /// for optimizations (such as memory maps). fn search_reader( &mut self, path: &Path, rdr: R, ) -> io::Result { use self::PatternMatcher::*; let (searcher, printer) = (&mut self.searcher, &mut self.printer); match self.matcher { RustRegex(ref m) => search_reader(m, searcher, printer, path, rdr), #[cfg(feature = "pcre2")] PCRE2(ref m) => search_reader(m, searcher, printer, path, rdr), } } } /// Search the contents of the given file path using the given matcher, /// searcher and printer. fn search_path( matcher: M, searcher: &mut Searcher, printer: &mut Printer, path: &Path, ) -> io::Result { match *printer { Printer::Standard(ref mut p) => { let mut sink = p.sink_with_path(&matcher, path); searcher.search_path(&matcher, path, &mut sink)?; Ok(SearchResult { has_match: sink.has_match(), stats: sink.stats().map(|s| s.clone()), }) } Printer::Summary(ref mut p) => { let mut sink = p.sink_with_path(&matcher, path); searcher.search_path(&matcher, path, &mut sink)?; Ok(SearchResult { has_match: sink.has_match(), stats: sink.stats().map(|s| s.clone()), }) } Printer::JSON(ref mut p) => { let mut sink = p.sink_with_path(&matcher, path); searcher.search_path(&matcher, path, &mut sink)?; Ok(SearchResult { has_match: sink.has_match(), stats: Some(sink.stats().clone()), }) } } } /// Search the contents of the given reader using the given matcher, searcher /// and printer. fn search_reader( matcher: M, searcher: &mut Searcher, printer: &mut Printer, path: &Path, rdr: R, ) -> io::Result { match *printer { Printer::Standard(ref mut p) => { let mut sink = p.sink_with_path(&matcher, path); searcher.search_reader(&matcher, rdr, &mut sink)?; Ok(SearchResult { has_match: sink.has_match(), stats: sink.stats().map(|s| s.clone()), }) } Printer::Summary(ref mut p) => { let mut sink = p.sink_with_path(&matcher, path); searcher.search_reader(&matcher, rdr, &mut sink)?; Ok(SearchResult { has_match: sink.has_match(), stats: sink.stats().map(|s| s.clone()), }) } Printer::JSON(ref mut p) => { let mut sink = p.sink_with_path(&matcher, path); searcher.search_reader(&matcher, rdr, &mut sink)?; Ok(SearchResult { has_match: sink.has_match(), stats: Some(sink.stats().clone()), }) } } } /// Return the given duration as fractional seconds. fn fractional_seconds(duration: Duration) -> f64 { (duration.as_secs() as f64) + (duration.subsec_nanos() as f64 * 1e-9) } ripgrep-11.0.2/src/subject.rs010064400017500000144000000127551352064771400142770ustar0000000000000000use std::path::Path; use ignore::{self, DirEntry}; use log; /// A configuration for describing how subjects should be built. #[derive(Clone, Debug)] struct Config { strip_dot_prefix: bool, } impl Default for Config { fn default() -> Config { Config { strip_dot_prefix: false, } } } /// A builder for constructing things to search over. #[derive(Clone, Debug)] pub struct SubjectBuilder { config: Config, } impl SubjectBuilder { /// Return a new subject builder with a default configuration. pub fn new() -> SubjectBuilder { SubjectBuilder { config: Config::default() } } /// Create a new subject from a possibly missing directory entry. /// /// If the directory entry isn't present, then the corresponding error is /// logged if messages have been configured. Otherwise, if the subject is /// deemed searchable, then it is returned. pub fn build_from_result( &self, result: Result, ) -> Option { match result { Ok(dent) => self.build(dent), Err(err) => { err_message!("{}", err); None } } } /// Create a new subject using this builder's configuration. /// /// If a subject could not be created or should otherwise not be searched, /// then this returns `None` after emitting any relevant log messages. pub fn build(&self, dent: DirEntry) -> Option { let subj = Subject { dent: dent, strip_dot_prefix: self.config.strip_dot_prefix, }; if let Some(ignore_err) = subj.dent.error() { ignore_message!("{}", ignore_err); } // If this entry was explicitly provided by an end user, then we always // want to search it. if subj.is_explicit() { return Some(subj); } // At this point, we only want to search something if it's explicitly a // file. This omits symlinks. (If ripgrep was configured to follow // symlinks, then they have already been followed by the directory // traversal.) if subj.is_file() { return Some(subj); } // We got nothin. Emit a debug message, but only if this isn't a // directory. Otherwise, emitting messages for directories is just // noisy. if !subj.is_dir() { log::debug!( "ignoring {}: failed to pass subject filter: \ file type: {:?}, metadata: {:?}", subj.dent.path().display(), subj.dent.file_type(), subj.dent.metadata() ); } None } /// When enabled, if the subject's file path starts with `./` then it is /// stripped. /// /// This is useful when implicitly searching the current working directory. pub fn strip_dot_prefix(&mut self, yes: bool) -> &mut SubjectBuilder { self.config.strip_dot_prefix = yes; self } } /// A subject is a thing we want to search. Generally, a subject is either a /// file or stdin. #[derive(Clone, Debug)] pub struct Subject { dent: DirEntry, strip_dot_prefix: bool, } impl Subject { /// Return the file path corresponding to this subject. /// /// If this subject corresponds to stdin, then a special `` path /// is returned instead. pub fn path(&self) -> &Path { if self.strip_dot_prefix && self.dent.path().starts_with("./") { self.dent.path().strip_prefix("./").unwrap() } else { self.dent.path() } } /// Returns true if and only if this entry corresponds to stdin. pub fn is_stdin(&self) -> bool { self.dent.is_stdin() } /// Returns true if and only if this entry corresponds to a subject to /// search that was explicitly supplied by an end user. /// /// Generally, this corresponds to either stdin or an explicit file path /// argument. e.g., in `rg foo some-file ./some-dir/`, `some-file` is /// an explicit subject, but, e.g., `./some-dir/some-other-file` is not. /// /// However, note that ripgrep does not see through shell globbing. e.g., /// in `rg foo ./some-dir/*`, `./some-dir/some-other-file` will be treated /// as an explicit subject. pub fn is_explicit(&self) -> bool { // stdin is obvious. When an entry has a depth of 0, that means it // was explicitly provided to our directory iterator, which means it // was in turn explicitly provided by the end user. The !is_dir check // means that we want to search files even if their symlinks, again, // because they were explicitly provided. (And we never want to try // to search a directory.) self.is_stdin() || (self.dent.depth() == 0 && !self.is_dir()) } /// Returns true if and only if this subject points to a directory after /// following symbolic links. fn is_dir(&self) -> bool { let ft = match self.dent.file_type() { None => return false, Some(ft) => ft, }; if ft.is_dir() { return true; } // If this is a symlink, then we want to follow it to determine // whether it's a directory or not. self.dent.path_is_symlink() && self.dent.path().is_dir() } /// Returns true if and only if this subject points to a file. fn is_file(&self) -> bool { self.dent.file_type().map_or(false, |ft| ft.is_file()) } } ripgrep-11.0.2/tests/binary.rs010064400017500000144000000271231352064771400144720ustar0000000000000000use crate::util::{Dir, TestCommand}; // This file contains a smattering of tests specifically for checking ripgrep's // handling of binary files. There's quite a bit of discussion on this in this // bug report: https://github.com/BurntSushi/ripgrep/issues/306 // Our haystack is the first 500 lines of Gutenberg's copy of "A Study in // Scarlet," with a NUL byte at line 237: `abcdef\x00`. // // The position and size of the haystack is, unfortunately, significant. In // particular, the NUL byte is specifically inserted at some point *after* the // first 8192 bytes, which corresponds to the initial capacity of the buffer // that ripgrep uses to read files. (grep for DEFAULT_BUFFER_CAPACITY.) The // position of the NUL byte ensures that we can execute some search on the // initial buffer contents without ever detecting any binary data. Moreover, // when using a memory map for searching, only the first 8192 bytes are // scanned for a NUL byte, so no binary bytes are detected at all when using // a memory map (unless our query matches line 237). // // One last note: in the tests below, we use --no-mmap heavily because binary // detection with memory maps is a bit different. Namely, NUL bytes are only // searched for in the first few KB of the file and in a match. Normally, NUL // bytes are searched for everywhere. // // TODO: Add tests for binary file detection when using memory maps. const HAY: &'static [u8] = include_bytes!("./data/sherlock-nul.txt"); // This tests that ripgrep prints a warning message if it finds and prints a // match in a binary file before detecting that it is a binary file. The point // here is to notify that user that the search of the file is only partially // complete. // // This applies to files that are *implicitly* searched via a recursive // directory traversal. In particular, this results in a WARNING message being // printed. We make our file "implicit" by doing a recursive search with a glob // that matches our file. rgtest!(after_match1_implicit, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "Project Gutenberg EBook", "-g", "hay", ]); let expected = "\ hay:1:The Project Gutenberg EBook of A Study In Scarlet, by Arthur Conan Doyle WARNING: stopped searching binary file hay after match (found \"\\u{0}\" byte around offset 9741) "; eqnice!(expected, cmd.stdout()); }); // Like after_match1_implicit, except we provide a file to search // explicitly. This results in identical behavior, but a different message. rgtest!(after_match1_explicit, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "Project Gutenberg EBook", "hay", ]); let expected = "\ 1:The Project Gutenberg EBook of A Study In Scarlet, by Arthur Conan Doyle Binary file matches (found \"\\u{0}\" byte around offset 9741) "; eqnice!(expected, cmd.stdout()); }); // Like after_match1_explicit, except we feed our content on stdin. rgtest!(after_match1_stdin, |_: Dir, mut cmd: TestCommand| { cmd.args(&[ "--no-mmap", "-n", "Project Gutenberg EBook", ]); let expected = "\ 1:The Project Gutenberg EBook of A Study In Scarlet, by Arthur Conan Doyle Binary file matches (found \"\\u{0}\" byte around offset 9741) "; eqnice!(expected, cmd.pipe(HAY)); }); // Like after_match1_implicit, but provides the --binary flag, which // disables binary filtering. Thus, this matches the behavior of ripgrep as // if the file were given explicitly. rgtest!(after_match1_implicit_binary, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "--binary", "Project Gutenberg EBook", "-g", "hay", ]); let expected = "\ hay:1:The Project Gutenberg EBook of A Study In Scarlet, by Arthur Conan Doyle Binary file hay matches (found \"\\u{0}\" byte around offset 9741) "; eqnice!(expected, cmd.stdout()); }); // Like after_match1_implicit, but enables -a/--text, so no binary // detection should be performed. rgtest!(after_match1_implicit_text, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "--text", "Project Gutenberg EBook", "-g", "hay", ]); let expected = "\ hay:1:The Project Gutenberg EBook of A Study In Scarlet, by Arthur Conan Doyle "; eqnice!(expected, cmd.stdout()); }); // Like after_match1_implicit_text, but enables -a/--text, so no binary // detection should be performed. rgtest!(after_match1_explicit_text, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "--text", "Project Gutenberg EBook", "hay", ]); let expected = "\ 1:The Project Gutenberg EBook of A Study In Scarlet, by Arthur Conan Doyle "; eqnice!(expected, cmd.stdout()); }); // Like after_match1_implicit, except this asks ripgrep to print all matching // files. // // This is an interesting corner case that one might consider a bug, however, // it's unlikely to be fixed. Namely, ripgrep probably shouldn't print `hay` // as a matching file since it is in fact a binary file, and thus should be // filtered out by default. However, the --files-with-matches flag will print // out the path of a matching file as soon as a match is seen and then stop // searching completely. Therefore, the NUL byte is never actually detected. // // The only way to fix this would be to kill ripgrep's performance in this case // and continue searching the entire file for a NUL byte. (Similarly if the // --quiet flag is set. See the next test.) rgtest!(after_match1_implicit_path, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-l", "Project Gutenberg EBook", "-g", "hay", ]); eqnice!("hay\n", cmd.stdout()); }); // Like after_match1_implicit_path, except this indicates that a match was // found with no other output. (This is the same bug described above, but // manifest as an exit code with no output.) rgtest!(after_match1_implicit_quiet, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-q", "Project Gutenberg EBook", "-g", "hay", ]); eqnice!("", cmd.stdout()); }); // This sets up the same test as after_match1_implicit_path, but instead of // just printing the matching files, this includes the full count of matches. // In this case, we need to search the entire file, so ripgrep correctly // detects the binary data and suppresses output. rgtest!(after_match1_implicit_count, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-c", "Project Gutenberg EBook", "-g", "hay", ]); cmd.assert_err(); }); // Like after_match1_implicit_count, except the --binary flag is provided, // which makes ripgrep disable binary data filtering even for implicit files. rgtest!(after_match1_implicit_count_binary, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-c", "--binary", "Project Gutenberg EBook", "-g", "hay", ]); eqnice!("hay:1\n", cmd.stdout()); }); // Like after_match1_implicit_count, except the file path is provided // explicitly, so binary filtering is disabled and a count is correctly // reported. rgtest!(after_match1_explicit_count, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-c", "Project Gutenberg EBook", "hay", ]); eqnice!("1\n", cmd.stdout()); }); // This tests that a match way before the NUL byte is shown, but a match after // the NUL byte is not. rgtest!(after_match2_implicit, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "Project Gutenberg EBook|a medical student", "-g", "hay", ]); let expected = "\ hay:1:The Project Gutenberg EBook of A Study In Scarlet, by Arthur Conan Doyle WARNING: stopped searching binary file hay after match (found \"\\u{0}\" byte around offset 9741) "; eqnice!(expected, cmd.stdout()); }); // Like after_match2_implicit, but enables -a/--text, so no binary // detection should be performed. rgtest!(after_match2_implicit_text, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "--text", "Project Gutenberg EBook|a medical student", "-g", "hay", ]); let expected = "\ hay:1:The Project Gutenberg EBook of A Study In Scarlet, by Arthur Conan Doyle hay:236:\"And yet you say he is not a medical student?\" "; eqnice!(expected, cmd.stdout()); }); // This tests that ripgrep *silently* quits before finding a match that occurs // after a NUL byte. rgtest!(before_match1_implicit, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "Heaven", "-g", "hay", ]); cmd.assert_err(); }); // This tests that ripgrep *does not* silently quit before finding a match that // occurs after a NUL byte when a file is explicitly searched. rgtest!(before_match1_explicit, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "Heaven", "hay", ]); let expected = "\ Binary file matches (found \"\\u{0}\" byte around offset 9741) "; eqnice!(expected, cmd.stdout()); }); // Like before_match1_implicit, but enables the --binary flag, which // disables binary filtering. Thus, this matches the behavior of ripgrep as if // the file were given explicitly. rgtest!(before_match1_implicit_binary, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "--binary", "Heaven", "-g", "hay", ]); let expected = "\ Binary file hay matches (found \"\\u{0}\" byte around offset 9741) "; eqnice!(expected, cmd.stdout()); }); // Like before_match1_implicit, but enables -a/--text, so no binary // detection should be performed. rgtest!(before_match1_implicit_text, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "--text", "Heaven", "-g", "hay", ]); let expected = "\ hay:238:\"No. Heaven knows what the objects of his studies are. But here we "; eqnice!(expected, cmd.stdout()); }); // This tests that ripgrep *silently* quits before finding a match that occurs // before a NUL byte, but within the same buffer as the NUL byte. rgtest!(before_match2_implicit, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "a medical student", "-g", "hay", ]); cmd.assert_err(); }); // This tests that ripgrep *does not* silently quit before finding a match that // occurs before a NUL byte, but within the same buffer as the NUL byte. Even // though the match occurs before the NUL byte, ripgrep still doesn't print it // because it has already scanned ahead to detect the NUL byte. (This matches // the behavior of GNU grep.) rgtest!(before_match2_explicit, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "a medical student", "hay", ]); let expected = "\ Binary file matches (found \"\\u{0}\" byte around offset 9741) "; eqnice!(expected, cmd.stdout()); }); // Like before_match1_implicit, but enables -a/--text, so no binary // detection should be performed. rgtest!(before_match2_implicit_text, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("hay", HAY); cmd.args(&[ "--no-mmap", "-n", "--text", "a medical student", "-g", "hay", ]); let expected = "\ hay:236:\"And yet you say he is not a medical student?\" "; eqnice!(expected, cmd.stdout()); }); ripgrep-11.0.2/tests/data/sherlock-nul.txt010064400017500000144000000547461351372666500167400ustar0000000000000000The Project Gutenberg EBook of A Study In Scarlet, by Arthur Conan Doyle This eBook is for the use of anyone anywhere at no cost and with almost no restrictions whatsoever. You may copy it, give it away or re-use it under the terms of the Project Gutenberg License included with this eBook or online at www.gutenberg.org Title: A Study In Scarlet Author: Arthur Conan Doyle Posting Date: July 12, 2008 [EBook #244] Release Date: April, 1995 [Last updated: February 17, 2013] Language: English *** START OF THIS PROJECT GUTENBERG EBOOK A STUDY IN SCARLET *** Produced by Roger Squires A STUDY IN SCARLET. By A. Conan Doyle [1] Original Transcriber's Note: This etext is prepared directly from an 1887 edition, and care has been taken to duplicate the original exactly, including typographical and punctuation vagaries. Additions to the text include adding the underscore character to indicate italics, and textual end-notes in square braces. Project Gutenberg Editor's Note: In reproofing and moving old PG files such as this to the present PG directory system it is the policy to reformat the text to conform to present PG Standards. In this case however, in consideration of the note above of the original transcriber describing his care to try to duplicate the original 1887 edition as to typography and punctuation vagaries, no changes have been made in this ascii text file. However, in the Latin-1 file and this html file, present standards are followed and the several French and Spanish words have been given their proper accents. Part II, The Country of the Saints, deals much with the Mormon Church. A STUDY IN SCARLET. PART I. (_Being a reprint from the reminiscences of_ JOHN H. WATSON, M.D., _late of the Army Medical Department._) [2] CHAPTER I. MR. SHERLOCK HOLMES. IN the year 1878 I took my degree of Doctor of Medicine of the University of London, and proceeded to Netley to go through the course prescribed for surgeons in the army. Having completed my studies there, I was duly attached to the Fifth Northumberland Fusiliers as Assistant Surgeon. The regiment was stationed in India at the time, and before I could join it, the second Afghan war had broken out. On landing at Bombay, I learned that my corps had advanced through the passes, and was already deep in the enemy's country. I followed, however, with many other officers who were in the same situation as myself, and succeeded in reaching Candahar in safety, where I found my regiment, and at once entered upon my new duties. The campaign brought honours and promotion to many, but for me it had nothing but misfortune and disaster. I was removed from my brigade and attached to the Berkshires, with whom I served at the fatal battle of Maiwand. There I was struck on the shoulder by a Jezail bullet, which shattered the bone and grazed the subclavian artery. I should have fallen into the hands of the murderous Ghazis had it not been for the devotion and courage shown by Murray, my orderly, who threw me across a pack-horse, and succeeded in bringing me safely to the British lines. Worn with pain, and weak from the prolonged hardships which I had undergone, I was removed, with a great train of wounded sufferers, to the base hospital at Peshawar. Here I rallied, and had already improved so far as to be able to walk about the wards, and even to bask a little upon the verandah, when I was struck down by enteric fever, that curse of our Indian possessions. For months my life was despaired of, and when at last I came to myself and became convalescent, I was so weak and emaciated that a medical board determined that not a day should be lost in sending me back to England. I was dispatched, accordingly, in the troopship "Orontes," and landed a month later on Portsmouth jetty, with my health irretrievably ruined, but with permission from a paternal government to spend the next nine months in attempting to improve it. I had neither kith nor kin in England, and was therefore as free as air--or as free as an income of eleven shillings and sixpence a day will permit a man to be. Under such circumstances, I naturally gravitated to London, that great cesspool into which all the loungers and idlers of the Empire are irresistibly drained. There I stayed for some time at a private hotel in the Strand, leading a comfortless, meaningless existence, and spending such money as I had, considerably more freely than I ought. So alarming did the state of my finances become, that I soon realized that I must either leave the metropolis and rusticate somewhere in the country, or that I must make a complete alteration in my style of living. Choosing the latter alternative, I began by making up my mind to leave the hotel, and to take up my quarters in some less pretentious and less expensive domicile. On the very day that I had come to this conclusion, I was standing at the Criterion Bar, when some one tapped me on the shoulder, and turning round I recognized young Stamford, who had been a dresser under me at Barts. The sight of a friendly face in the great wilderness of London is a pleasant thing indeed to a lonely man. In old days Stamford had never been a particular crony of mine, but now I hailed him with enthusiasm, and he, in his turn, appeared to be delighted to see me. In the exuberance of my joy, I asked him to lunch with me at the Holborn, and we started off together in a hansom. "Whatever have you been doing with yourself, Watson?" he asked in undisguised wonder, as we rattled through the crowded London streets. "You are as thin as a lath and as brown as a nut." I gave him a short sketch of my adventures, and had hardly concluded it by the time that we reached our destination. "Poor devil!" he said, commiseratingly, after he had listened to my misfortunes. "What are you up to now?" "Looking for lodgings." [3] I answered. "Trying to solve the problem as to whether it is possible to get comfortable rooms at a reasonable price." "That's a strange thing," remarked my companion; "you are the second man to-day that has used that expression to me." "And who was the first?" I asked. "A fellow who is working at the chemical laboratory up at the hospital. He was bemoaning himself this morning because he could not get someone to go halves with him in some nice rooms which he had found, and which were too much for his purse." "By Jove!" I cried, "if he really wants someone to share the rooms and the expense, I am the very man for him. I should prefer having a partner to being alone." Young Stamford looked rather strangely at me over his wine-glass. "You don't know Sherlock Holmes yet," he said; "perhaps you would not care for him as a constant companion." "Why, what is there against him?" "Oh, I didn't say there was anything against him. He is a little queer in his ideas--an enthusiast in some branches of science. As far as I know he is a decent fellow enough." "A medical student, I suppose?" said I. "No--I have no idea what he intends to go in for. I believe he is well up in anatomy, and he is a first-class chemist; but, as far as I know, he has never taken out any systematic medical classes. His studies are very desultory and eccentric, but he has amassed a lot of out-of-the way knowledge which would astonish his professors." "Did you never ask him what he was going in for?" I asked. "No; he is not a man that it is easy to draw out, though he can be communicative enough when the fancy seizes him." "I should like to meet him," I said. "If I am to lodge with anyone, I should prefer a man of studious and quiet habits. I am not strong enough yet to stand much noise or excitement. I had enough of both in Afghanistan to last me for the remainder of my natural existence. How could I meet this friend of yours?" "He is sure to be at the laboratory," returned my companion. "He either avoids the place for weeks, or else he works there from morning to night. If you like, we shall drive round together after luncheon." "Certainly," I answered, and the conversation drifted away into other channels. As we made our way to the hospital after leaving the Holborn, Stamford gave me a few more particulars about the gentleman whom I proposed to take as a fellow-lodger. "You mustn't blame me if you don't get on with him," he said; "I know nothing more of him than I have learned from meeting him occasionally in the laboratory. You proposed this arrangement, so you must not hold me responsible." "If we don't get on it will be easy to part company," I answered. "It seems to me, Stamford," I added, looking hard at my companion, "that you have some reason for washing your hands of the matter. Is this fellow's temper so formidable, or what is it? Don't be mealy-mouthed about it." "It is not easy to express the inexpressible," he answered with a laugh. "Holmes is a little too scientific for my tastes--it approaches to cold-bloodedness. I could imagine his giving a friend a little pinch of the latest vegetable alkaloid, not out of malevolence, you understand, but simply out of a spirit of inquiry in order to have an accurate idea of the effects. To do him justice, I think that he would take it himself with the same readiness. He appears to have a passion for definite and exact knowledge." "Very right too." "Yes, but it may be pushed to excess. When it comes to beating the subjects in the dissecting-rooms with a stick, it is certainly taking rather a bizarre shape." "Beating the subjects!" "Yes, to verify how far bruises may be produced after death. I saw him at it with my own eyes." "And yet you say he is not a medical student?" abcdef "No. Heaven knows what the objects of his studies are. But here we are, and you must form your own impressions about him." As he spoke, we turned down a narrow lane and passed through a small side-door, which opened into a wing of the great hospital. It was familiar ground to me, and I needed no guiding as we ascended the bleak stone staircase and made our way down the long corridor with its vista of whitewashed wall and dun-coloured doors. Near the further end a low arched passage branched away from it and led to the chemical laboratory. This was a lofty chamber, lined and littered with countless bottles. Broad, low tables were scattered about, which bristled with retorts, test-tubes, and little Bunsen lamps, with their blue flickering flames. There was only one student in the room, who was bending over a distant table absorbed in his work. At the sound of our steps he glanced round and sprang to his feet with a cry of pleasure. "I've found it! I've found it," he shouted to my companion, running towards us with a test-tube in his hand. "I have found a re-agent which is precipitated by hoemoglobin, [4] and by nothing else." Had he discovered a gold mine, greater delight could not have shone upon his features. "Dr. Watson, Mr. Sherlock Holmes," said Stamford, introducing us. "How are you?" he said cordially, gripping my hand with a strength for which I should hardly have given him credit. "You have been in Afghanistan, I perceive." "How on earth did you know that?" I asked in astonishment. "Never mind," said he, chuckling to himself. "The question now is about hoemoglobin. No doubt you see the significance of this discovery of mine?" "It is interesting, chemically, no doubt," I answered, "but practically----" "Why, man, it is the most practical medico-legal discovery for years. Don't you see that it gives us an infallible test for blood stains. Come over here now!" He seized me by the coat-sleeve in his eagerness, and drew me over to the table at which he had been working. "Let us have some fresh blood," he said, digging a long bodkin into his finger, and drawing off the resulting drop of blood in a chemical pipette. "Now, I add this small quantity of blood to a litre of water. You perceive that the resulting mixture has the appearance of pure water. The proportion of blood cannot be more than one in a million. I have no doubt, however, that we shall be able to obtain the characteristic reaction." As he spoke, he threw into the vessel a few white crystals, and then added some drops of a transparent fluid. In an instant the contents assumed a dull mahogany colour, and a brownish dust was precipitated to the bottom of the glass jar. "Ha! ha!" he cried, clapping his hands, and looking as delighted as a child with a new toy. "What do you think of that?" "It seems to be a very delicate test," I remarked. "Beautiful! beautiful! The old Guiacum test was very clumsy and uncertain. So is the microscopic examination for blood corpuscles. The latter is valueless if the stains are a few hours old. Now, this appears to act as well whether the blood is old or new. Had this test been invented, there are hundreds of men now walking the earth who would long ago have paid the penalty of their crimes." "Indeed!" I murmured. "Criminal cases are continually hinging upon that one point. A man is suspected of a crime months perhaps after it has been committed. His linen or clothes are examined, and brownish stains discovered upon them. Are they blood stains, or mud stains, or rust stains, or fruit stains, or what are they? That is a question which has puzzled many an expert, and why? Because there was no reliable test. Now we have the Sherlock Holmes' test, and there will no longer be any difficulty." His eyes fairly glittered as he spoke, and he put his hand over his heart and bowed as if to some applauding crowd conjured up by his imagination. "You are to be congratulated," I remarked, considerably surprised at his enthusiasm. "There was the case of Von Bischoff at Frankfort last year. He would certainly have been hung had this test been in existence. Then there was Mason of Bradford, and the notorious Muller, and Lefevre of Montpellier, and Samson of New Orleans. I could name a score of cases in which it would have been decisive." "You seem to be a walking calendar of crime," said Stamford with a laugh. "You might start a paper on those lines. Call it the 'Police News of the Past.'" "Very interesting reading it might be made, too," remarked Sherlock Holmes, sticking a small piece of plaster over the prick on his finger. "I have to be careful," he continued, turning to me with a smile, "for I dabble with poisons a good deal." He held out his hand as he spoke, and I noticed that it was all mottled over with similar pieces of plaster, and discoloured with strong acids. "We came here on business," said Stamford, sitting down on a high three-legged stool, and pushing another one in my direction with his foot. "My friend here wants to take diggings, and as you were complaining that you could get no one to go halves with you, I thought that I had better bring you together." Sherlock Holmes seemed delighted at the idea of sharing his rooms with me. "I have my eye on a suite in Baker Street," he said, "which would suit us down to the ground. You don't mind the smell of strong tobacco, I hope?" "I always smoke 'ship's' myself," I answered. "That's good enough. I generally have chemicals about, and occasionally do experiments. Would that annoy you?" "By no means." "Let me see--what are my other shortcomings. I get in the dumps at times, and don't open my mouth for days on end. You must not think I am sulky when I do that. Just let me alone, and I'll soon be right. What have you to confess now? It's just as well for two fellows to know the worst of one another before they begin to live together." I laughed at this cross-examination. "I keep a bull pup," I said, "and I object to rows because my nerves are shaken, and I get up at all sorts of ungodly hours, and I am extremely lazy. I have another set of vices when I'm well, but those are the principal ones at present." "Do you include violin-playing in your category of rows?" he asked, anxiously. "It depends on the player," I answered. "A well-played violin is a treat for the gods--a badly-played one----" "Oh, that's all right," he cried, with a merry laugh. "I think we may consider the thing as settled--that is, if the rooms are agreeable to you." "When shall we see them?" "Call for me here at noon to-morrow, and we'll go together and settle everything," he answered. "All right--noon exactly," said I, shaking his hand. We left him working among his chemicals, and we walked together towards my hotel. "By the way," I asked suddenly, stopping and turning upon Stamford, "how the deuce did he know that I had come from Afghanistan?" My companion smiled an enigmatical smile. "That's just his little peculiarity," he said. "A good many people have wanted to know how he finds things out." "Oh! a mystery is it?" I cried, rubbing my hands. "This is very piquant. I am much obliged to you for bringing us together. 'The proper study of mankind is man,' you know." "You must study him, then," Stamford said, as he bade me good-bye. "You'll find him a knotty problem, though. I'll wager he learns more about you than you about him. Good-bye." "Good-bye," I answered, and strolled on to my hotel, considerably interested in my new acquaintance. CHAPTER II. THE SCIENCE OF DEDUCTION. WE met next day as he had arranged, and inspected the rooms at No. 221B, [5] Baker Street, of which he had spoken at our meeting. They consisted of a couple of comfortable bed-rooms and a single large airy sitting-room, cheerfully furnished, and illuminated by two broad windows. So desirable in every way were the apartments, and so moderate did the terms seem when divided between us, that the bargain was concluded upon the spot, and we at once entered into possession. That very evening I moved my things round from the hotel, and on the following morning Sherlock Holmes followed me with several boxes and portmanteaus. For a day or two we were busily employed in unpacking and laying out our property to the best advantage. That done, we gradually began to settle down and to accommodate ourselves to our new surroundings. Holmes was certainly not a difficult man to live with. He was quiet in his ways, and his habits were regular. It was rare for him to be up after ten at night, and he had invariably breakfasted and gone out before I rose in the morning. Sometimes he spent his day at the chemical laboratory, sometimes in the dissecting-rooms, and occasionally in long walks, which appeared to take him into the lowest portions of the City. Nothing could exceed his energy when the working fit was upon him; but now and again a reaction would seize him, and for days on end he would lie upon the sofa in the sitting-room, hardly uttering a word or moving a muscle from morning to night. On these occasions I have noticed such a dreamy, vacant expression in his eyes, that I might have suspected him of being addicted to the use of some narcotic, had not the temperance and cleanliness of his whole life forbidden such a notion. As the weeks went by, my interest in him and my curiosity as to his aims in life, gradually deepened and increased. His very person and appearance were such as to strike the attention of the most casual observer. In height he was rather over six feet, and so excessively lean that he seemed to be considerably taller. His eyes were sharp and piercing, save during those intervals of torpor to which I have alluded; and his thin, hawk-like nose gave his whole expression an air of alertness and decision. His chin, too, had the prominence and squareness which mark the man of determination. His hands were invariably blotted with ink and stained with chemicals, yet he was possessed of extraordinary delicacy of touch, as I frequently had occasion to observe when I watched him manipulating his fragile philosophical instruments. The reader may set me down as a hopeless busybody, when I confess how much this man stimulated my curiosity, and how often I endeavoured to break through the reticence which he showed on all that concerned himself. Before pronouncing judgment, however, be it remembered, how objectless was my life, and how little there was to engage my attention. My health forbade me from venturing out unless the weather was exceptionally genial, and I had no friends who would call upon me and break the monotony of my daily existence. Under these circumstances, I eagerly hailed the little mystery which hung around my companion, and spent much of my time in endeavouring to unravel it. He was not studying medicine. He had himself, in reply to a question, confirmed Stamford's opinion upon that point. Neither did he appear to have pursued any course of reading which might fit him for a degree in science or any other recognized portal which would give him an entrance into the learned world. Yet his zeal for certain studies was remarkable, and within eccentric limits his knowledge was so extraordinarily ample and minute that his observations have fairly astounded me. Surely no man would work so hard or attain such precise information unless he had some definite end in view. Desultory readers are seldom remarkable for the exactness of their learning. No man burdens his mind with small matters unless he has some very good reason for doing so. His ignorance was as remarkable as his knowledge. Of contemporary literature, philosophy and politics he appeared to know next to nothing. Upon my quoting Thomas Carlyle, he inquired in the naivest way who he might be and what he had done. My surprise reached a climax, however, when I found incidentally that he was ignorant of the Copernican Theory and of the composition of the Solar System. That any civilized human being in this nineteenth century should not be aware that the earth travelled round the sun appeared to be to me such an extraordinary fact that I could hardly realize it. "You appear to be astonished," he said, smiling at my expression of surprise. "Now that I do know it I shall do my best to forget it." "To forget it!" "You see," he explained, "I consider that a man's brain originally is like a little empty attic, and you have to stock it with such furniture as you choose. A fool takes in all the lumber of every sort that he comes across, so that the knowledge which might be useful to him gets crowded out, or at best is jumbled up with a lot of other things so that he has a difficulty in laying his hands upon it. Now the skilful workman is very careful indeed as to what he takes into his brain-attic. He will have nothing but the tools which may help him in doing his work, but of these he has a large assortment, and all in the most perfect order. It is a mistake to think that that little room has elastic walls and can distend to any extent. Depend upon it there comes a time when for every addition of knowledge you forget something that you knew before. It is of the highest importance, therefore, not to have useless facts elbowing out the useful ones." ripgrep-11.0.2/tests/data/sherlock.br010064400017500000144000000002721351372666500157110ustar0000000000000000n-_. cMY4Ya -LO(8sn^Gwш!, KD/7th ]jE_;drFQs/:DIVB}T7ѵH2)M[ui50ڮY6%ר_U by4Ϡ!&g#ripgrep-11.0.2/tests/data/sherlock.bz2010064400017500000144000000004201351372666500157760ustar0000000000000000BZh91AY&SY>>(_@@?0)ѩi@1ɀ5n}@KBu'91(x3?B6q,el"g{04[nIO$E迷L SirzY=G%Qbg 6{Q>njrN4ENiqAI[=Q…Z#7!%.EWQ2,5ksipCCZ o4mU;- g"o)'v2wi&++k݉XJ[oGăؘ< xi8&dqxc:.6 3_@X#9H6?OrrD_h~ nC)-7f yN1_Lş\-h9=toripgrep-11.0.2/tests/data/sherlock.lz4010064400017500000144000000005551351372666500160230ustar0000000000000000"MD@^Z$For the Doctor Watsons of this world, as opposed to0Sherlock Holmeses, success in"3province of detective work must always be, to a very large extent,Gresult of luck.y y# can extract a clew from a wisp of straw or a flakcigar ash; butM has to have it taken out for him and dusted, and exhibited clearly, with a label attached. ^sripgrep-11.0.2/tests/data/sherlock.lzma010064400017500000144000000004361351372666500162530ustar0000000000000000]#B=h9jǴ]B%2G; i6<߿.ށ.H drmq4RE>sp2}|kDlF[qV oJ#f nCubtdg Э.|~$ٽ)8&/U8cR"`ש}ekG HɵNGn+Z `e1d\[@_D%YyPᓲأJ֫>/-R!3`tEripgrep-11.0.2/tests/data/sherlock.xz010064400017500000144000000005141351372666500157460ustar00000000000000007zXZִF!t/n ]#B=h9jǴ]B%2G; i6<߿.ށ.H drmq4RE>sp2}|kDlF[qV oJ#f nCubtdg Э.|~$ٽ)8&/U8cR"`ש}ekG HɵNGn+Z `e1d\[@_D%YyPᓲأJ֫>/-R!3`0(\2a#0gYZripgrep-11.0.2/tests/data/sherlock.zst010064400017500000144000000003711351372666500161260ustar0000000000000000(/Pe4MVN)IuLb:--,+Y0u# #\+& ZυQ͚u8q h(Ga5')q] pMW#{~Y/2s!9rhj>#r Bx=|Fʻ*6d$d:0_efx ~z+P,U%\f ԛripgrep-11.0.2/tests/feature.rs010064400017500000144000000562671352064771400146540ustar0000000000000000use crate::hay::{SHERLOCK, SHERLOCK_CRLF}; use crate::util::{Dir, TestCommand, sort_lines}; // See: https://github.com/BurntSushi/ripgrep/issues/1 rgtest!(f1_sjis, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes( "foo", b"\x84Y\x84u\x84\x82\x84|\x84\x80\x84{ \x84V\x84\x80\x84|\x84}\x84\x83" ); cmd.arg("-Esjis").arg("Шерлок Холмс"); eqnice!("foo:Шерлок Холмс\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/1 rgtest!(f1_utf16_auto, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes( "foo", b"\xff\xfe(\x045\x04@\x04;\x04>\x04:\x04 \x00%\x04>\x04;\x04<\x04A\x04" ); cmd.arg("Шерлок Холмс"); eqnice!("foo:Шерлок Холмс\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/1 rgtest!(f1_utf16_explicit, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes( "foo", b"\xff\xfe(\x045\x04@\x04;\x04>\x04:\x04 \x00%\x04>\x04;\x04<\x04A\x04" ); cmd.arg("-Eutf-16le").arg("Шерлок Холмс"); eqnice!("foo:Шерлок Холмс\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/1 rgtest!(f1_eucjp, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes( "foo", b"\xa7\xba\xa7\xd6\xa7\xe2\xa7\xdd\xa7\xe0\xa7\xdc \xa7\xb7\xa7\xe0\xa7\xdd\xa7\xde\xa7\xe3" ); cmd.arg("-Eeuc-jp").arg("Шерлок Холмс"); eqnice!("foo:Шерлок Холмс\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/1 rgtest!(f1_unknown_encoding, |_: Dir, mut cmd: TestCommand| { cmd.arg("-Efoobar").assert_non_empty_stderr(); }); // See: https://github.com/BurntSushi/ripgrep/issues/1 rgtest!(f1_replacement_encoding, |_: Dir, mut cmd: TestCommand| { cmd.arg("-Ecsiso2022kr").assert_non_empty_stderr(); }); // See: https://github.com/BurntSushi/ripgrep/issues/7 rgtest!(f7, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("pat", "Sherlock\nHolmes"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock Holmeses, success in the province of detective work must always be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.arg("-fpat").arg("sherlock").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/7 rgtest!(f7_stdin, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.arg("-f-").pipe(b"Sherlock")); }); // See: https://github.com/BurntSushi/ripgrep/issues/20 rgtest!(f20_no_filename, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--no-filename"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.arg("--no-filename").arg("Sherlock").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/34 rgtest!(f34_only_matching, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); let expected = "\ sherlock:Sherlock sherlock:Sherlock "; eqnice!(expected, cmd.arg("-o").arg("Sherlock").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/34 rgtest!(f34_only_matching_line_column, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); let expected = "\ sherlock:1:57:Sherlock sherlock:3:49:Sherlock "; cmd.arg("-o").arg("--column").arg("-n").arg("Sherlock"); eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/45 rgtest!(f45_relative_cwd, |dir: Dir, mut cmd: TestCommand| { dir.create(".not-an-ignore", "foo\n/bar"); dir.create_dir("bar"); dir.create_dir("baz/bar"); dir.create_dir("baz/baz/bar"); dir.create("bar/test", "test"); dir.create("baz/bar/test", "test"); dir.create("baz/baz/bar/test", "test"); dir.create("baz/foo", "test"); dir.create("baz/test", "test"); dir.create("foo", "test"); dir.create("test", "test"); cmd.arg("-l").arg("test"); // First, get a baseline without applying ignore rules. let expected = " bar/test baz/bar/test baz/baz/bar/test baz/foo baz/test foo test "; eqnice!(sort_lines(expected), sort_lines(&cmd.stdout())); // Now try again with the ignore file activated. cmd.arg("--ignore-file").arg(".not-an-ignore"); let expected = " baz/bar/test baz/baz/bar/test baz/test test "; eqnice!(sort_lines(expected), sort_lines(&cmd.stdout())); // Now do it again, but inside the baz directory. Since the ignore file // is interpreted relative to the CWD, this will cause the /bar anchored // pattern to filter out baz/bar, which is a subtle difference between true // parent ignore files and manually specified ignore files. let mut cmd = dir.command(); cmd.args(&["--ignore-file", "../.not-an-ignore", "-l", "test"]); cmd.current_dir(dir.path().join("baz")); let expected = " baz/bar/test test "; eqnice!(sort_lines(expected), sort_lines(&cmd.stdout())); }); // See: https://github.com/BurntSushi/ripgrep/issues/45 rgtest!(f45_precedence_with_others, |dir: Dir, mut cmd: TestCommand| { dir.create(".not-an-ignore", "*.log"); dir.create(".ignore", "!imp.log"); dir.create("imp.log", "test"); dir.create("wat.log", "test"); cmd.arg("--ignore-file").arg(".not-an-ignore").arg("test"); eqnice!("imp.log:test\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/45 rgtest!(f45_precedence_internal, |dir: Dir, mut cmd: TestCommand| { dir.create(".not-an-ignore1", "*.log"); dir.create(".not-an-ignore2", "!imp.log"); dir.create("imp.log", "test"); dir.create("wat.log", "test"); cmd.args(&[ "--ignore-file", ".not-an-ignore1", "--ignore-file", ".not-an-ignore2", "test", ]); eqnice!("imp.log:test\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/68 rgtest!(f68_no_ignore_vcs, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "foo"); dir.create(".ignore", "bar"); dir.create("foo", "test"); dir.create("bar", "test"); eqnice!("foo:test\n", cmd.arg("--no-ignore-vcs").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/70 rgtest!(f70_smart_case, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.arg("-S").arg("sherlock").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/89 rgtest!(f89_files_with_matches, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--null").arg("--files-with-matches").arg("Sherlock"); eqnice!("sherlock\x00", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/89 rgtest!(f89_files_without_match, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file.py", "foo"); cmd.arg("--null").arg("--files-without-match").arg("Sherlock"); eqnice!("file.py\x00", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/89 rgtest!(f89_count, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--null").arg("--count").arg("Sherlock"); eqnice!("sherlock\x002\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/89 rgtest!(f89_files, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); eqnice!("sherlock\x00", cmd.arg("--null").arg("--files").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/89 rgtest!(f89_match, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); let expected = "\ sherlock\x00For the Doctor Watsons of this world, as opposed to the Sherlock sherlock\x00Holmeses, success in the province of detective work must always sherlock\x00be, to a very large extent, the result of luck. Sherlock Holmes sherlock\x00can extract a clew from a wisp of straw or a flake of cigar ash; "; eqnice!(expected, cmd.arg("--null").arg("-C1").arg("Sherlock").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/109 rgtest!(f109_max_depth, |dir: Dir, mut cmd: TestCommand| { dir.create_dir("one"); dir.create("one/pass", "far"); dir.create_dir("one/too"); dir.create("one/too/many", "far"); cmd.arg("--maxdepth").arg("2").arg("far"); eqnice!("one/pass:far\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/124 rgtest!(f109_case_sensitive_part1, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "tEsT"); cmd.arg("--smart-case").arg("--case-sensitive").arg("test").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/124 rgtest!(f109_case_sensitive_part2, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "tEsT"); cmd.arg("--ignore-case").arg("--case-sensitive").arg("test").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/129 rgtest!(f129_matches, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "test\ntest abcdefghijklmnopqrstuvwxyz test"); let expected = "foo:test\nfoo:[Omitted long matching line]\n"; eqnice!(expected, cmd.arg("-M26").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/129 rgtest!(f129_context, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "test\nabcdefghijklmnopqrstuvwxyz"); let expected = "foo:test\nfoo-[Omitted long context line]\n"; eqnice!(expected, cmd.arg("-M20").arg("-C1").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/129 rgtest!(f129_replace, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "test\ntest abcdefghijklmnopqrstuvwxyz test"); let expected = "foo:foo\nfoo:[Omitted long line with 2 matches]\n"; eqnice!(expected, cmd.arg("-M26").arg("-rfoo").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/159 rgtest!(f159_max_count, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "test\ntest"); eqnice!("foo:test\n", cmd.arg("-m1").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/159 rgtest!(f159_max_count_zero, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "test\ntest"); cmd.arg("-m0").arg("test").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/196 rgtest!(f196_persistent_config, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("sherlock").arg("sherlock"); // Make sure we get no matches by default. cmd.assert_err(); // Now add our config file, and make sure it impacts ripgrep. dir.create(".ripgreprc", "--ignore-case"); cmd.cmd().env("RIPGREP_CONFIG_PATH", ".ripgreprc"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/243 rgtest!(f243_column_line, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "test"); eqnice!("foo:1:1:test\n", cmd.arg("--column").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/263 rgtest!(f263_sort_files, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "test"); dir.create("abc", "test"); dir.create("zoo", "test"); dir.create("bar", "test"); let expected = "abc:test\nbar:test\nfoo:test\nzoo:test\n"; eqnice!(expected, cmd.arg("--sort-files").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/275 rgtest!(f275_pathsep, |dir: Dir, mut cmd: TestCommand| { dir.create_dir("foo"); dir.create("foo/bar", "test"); cmd.arg("test").arg("--path-separator").arg("Z"); eqnice!("fooZbar:test\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/362 rgtest!(f362_dfa_size_limit, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); // This should fall back to the nfa engine but should still produce the // expected result. cmd.arg("--dfa-size-limit").arg("10").arg(r"For\s").arg("sherlock"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock "; eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/362 rgtest!(f362_exceeds_regex_size_limit, |dir: Dir, mut cmd: TestCommand| { // --regex-size-limit doesn't apply to PCRE2. if dir.is_pcre2() { return; } cmd.arg("--regex-size-limit").arg("10K").arg(r"[0-9]\w+").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/362 #[cfg(target_pointer_width = "32")] rgtest!(f362_u64_to_narrow_usize_overflow, |dir: Dir, mut cmd: TestCommand| { // --dfa-size-limit doesn't apply to PCRE2. if dir.is_pcre2() { return; } dir.create_size("foo", 1000000); // 2^35 * 2^20 is ok for u64, but not for usize cmd.arg("--dfa-size-limit").arg("34359738368M").arg("--files"); cmd.assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/411 rgtest!(f411_single_threaded_search_stats, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); let lines = cmd.arg("--stats").arg("Sherlock").stdout(); assert!(lines.contains("2 matched lines")); assert!(lines.contains("1 files contained matches")); assert!(lines.contains("1 files searched")); assert!(lines.contains("seconds")); }); rgtest!(f411_parallel_search_stats, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock_1", SHERLOCK); dir.create("sherlock_2", SHERLOCK); let lines = cmd.arg("--stats").arg("Sherlock").stdout(); assert!(lines.contains("4 matched lines")); assert!(lines.contains("2 files contained matches")); assert!(lines.contains("2 files searched")); assert!(lines.contains("seconds")); }); // See: https://github.com/BurntSushi/ripgrep/issues/416 rgtest!(f416_crlf, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK_CRLF); cmd.arg("--crlf").arg(r"Sherlock$").arg("sherlock"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock\r "; eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/416 rgtest!(f416_crlf_multiline, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK_CRLF); cmd.arg("--crlf").arg("-U").arg(r"Sherlock$").arg("sherlock"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock\r "; eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/416 rgtest!(f416_crlf_only_matching, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK_CRLF); cmd.arg("--crlf").arg("-o").arg(r"Sherlock$").arg("sherlock"); let expected = "\ Sherlock\r "; eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/419 rgtest!(f419_zero_as_shortcut_for_null, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-0").arg("--count").arg("Sherlock"); eqnice!("sherlock\x002\n", cmd.stdout()); }); rgtest!(f740_passthru, |dir: Dir, mut cmd: TestCommand| { dir.create("file", "\nfoo\nbar\nfoobar\n\nbaz\n"); dir.create("patterns", "foo\nbar\n"); // We can't assume that the way colour specs are translated to ANSI // sequences will remain stable, and --replace doesn't currently work with // pass-through, so for now we don't actually test the match sub-strings let common_args = &["-n", "--passthru"]; let foo_expected = "\ 1- 2:foo 3-bar 4:foobar 5- 6-baz "; // With single pattern cmd.args(common_args).arg("foo").arg("file"); eqnice!(foo_expected, cmd.stdout()); let foo_bar_expected = "\ 1- 2:foo 3:bar 4:foobar 5- 6-baz "; // With multiple -e patterns let mut cmd = dir.command(); cmd.args(common_args); cmd.args(&["-e", "foo", "-e", "bar", "file"]); eqnice!(foo_bar_expected, cmd.stdout()); // With multiple -f patterns let mut cmd = dir.command(); cmd.args(common_args); cmd.args(&["-f", "patterns", "file"]); eqnice!(foo_bar_expected, cmd.stdout()); // -c should override let mut cmd = dir.command(); cmd.args(common_args); cmd.args(&["-c", "foo", "file"]); eqnice!("2\n", cmd.stdout()); let only_foo_expected = "\ 1- 2:foo 3-bar 4:foo 5- 6-baz "; // -o should work let mut cmd = dir.command(); cmd.args(common_args); cmd.args(&["-o", "foo", "file"]); eqnice!(only_foo_expected, cmd.stdout()); let replace_foo_expected = "\ 1- 2:wat 3-bar 4:watbar 5- 6-baz "; // -r should work let mut cmd = dir.command(); cmd.args(common_args); cmd.args(&["-r", "wat", "foo", "file"]); eqnice!(replace_foo_expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/948 rgtest!(f948_exit_code_match, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("."); cmd.assert_exit_code(0); }); // See: https://github.com/BurntSushi/ripgrep/issues/948 rgtest!(f948_exit_code_no_match, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("NADA"); cmd.assert_exit_code(1); }); // See: https://github.com/BurntSushi/ripgrep/issues/948 rgtest!(f948_exit_code_error, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("*"); cmd.assert_exit_code(2); }); // See: https://github.com/BurntSushi/ripgrep/issues/917 rgtest!(f917_trim, |dir: Dir, mut cmd: TestCommand| { const SHERLOCK: &'static str = "\ zzz For the Doctor Watsons of this world, as opposed to the Sherlock Holmeses, success in the province of detective work must always \tbe, to a very large extent, the result of luck. Sherlock Holmes can extract a clew from a wisp of straw or a flake of cigar ash; but Doctor Watson has to have it taken out for him and dusted, and exhibited clearly, with a label attached. "; dir.create("sherlock", SHERLOCK); cmd.args(&[ "-n", "-B1", "-A2", "--trim", "Holmeses", "sherlock", ]); let expected = "\ 2-For the Doctor Watsons of this world, as opposed to the Sherlock 3:Holmeses, success in the province of detective work must always 4-be, to a very large extent, the result of luck. Sherlock Holmes 5-can extract a clew from a wisp of straw or a flake of cigar ash; "; eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/917 // // This is like f917_trim, except this tests that trimming occurs even when the // whitespace is part of a match. rgtest!(f917_trim_match, |dir: Dir, mut cmd: TestCommand| { const SHERLOCK: &'static str = "\ zzz For the Doctor Watsons of this world, as opposed to the Sherlock Holmeses, success in the province of detective work must always \tbe, to a very large extent, the result of luck. Sherlock Holmes can extract a clew from a wisp of straw or a flake of cigar ash; but Doctor Watson has to have it taken out for him and dusted, and exhibited clearly, with a label attached. "; dir.create("sherlock", SHERLOCK); cmd.args(&[ "-n", "-B1", "-A2", "--trim", r"\s+Holmeses", "sherlock", ]); let expected = "\ 2-For the Doctor Watsons of this world, as opposed to the Sherlock 3:Holmeses, success in the province of detective work must always 4-be, to a very large extent, the result of luck. Sherlock Holmes 5-can extract a clew from a wisp of straw or a flake of cigar ash; "; eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/993 rgtest!(f993_null_data, |dir: Dir, mut cmd: TestCommand| { dir.create("test", "foo\x00bar\x00\x00\x00baz\x00"); cmd.arg("--null-data").arg(r".+").arg("test"); // If we just used -a instead of --null-data, then the result would include // all NUL bytes. let expected = "foo\x00bar\x00baz\x00"; eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/1078 // // N.B. There are many more tests in the grep-printer crate. rgtest!(f1078_max_columns_preview1, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.args(&[ "-M46", "--max-columns-preview", "exhibited|dusted|has to have it", ]); let expected = "\ sherlock:but Doctor Watson has to have it taken out for [... omitted end of long line] sherlock:and exhibited clearly, with a label attached. "; eqnice!(expected, cmd.stdout()); }); rgtest!(f1078_max_columns_preview2, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.args(&[ "-M43", "--max-columns-preview", // Doing a replacement forces ripgrep to show the number of remaining // matches. Normally, this happens by default when printing a tty with // colors. "-rxxx", "exhibited|dusted|has to have it", ]); let expected = "\ sherlock:but Doctor Watson xxx taken out for him and [... 1 more match] sherlock:and xxx clearly, with a label attached. "; eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/1138 rgtest!(f1138_no_ignore_dot, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "foo"); dir.create(".ignore", "bar"); dir.create(".fzf-ignore", "quux"); dir.create("foo", ""); dir.create("bar", ""); dir.create("quux", ""); cmd.arg("--sort").arg("path").arg("--files"); eqnice!("quux\n", cmd.stdout()); eqnice!("bar\nquux\n", cmd.arg("--no-ignore-dot").stdout()); eqnice!("bar\n", cmd.arg("--ignore-file").arg(".fzf-ignore").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/1155 rgtest!(f1155_auto_hybrid_regex, |dir: Dir, mut cmd: TestCommand| { // No sense in testing a hybrid regex engine with only one engine! if !dir.is_pcre2() { return; } dir.create("sherlock", SHERLOCK); cmd.arg("--no-pcre2").arg("--auto-hybrid-regex").arg(r"(?<=the )Sherlock"); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock "; eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/1207 // // Tests if without encoding 'none' flag null bytes are consumed by automatic // encoding detection. rgtest!(f1207_auto_encoding, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes( "foo", b"\xFF\xFE\x00\x62" ); cmd.arg("-a").arg("\\x00").arg("foo"); cmd.assert_exit_code(1); }); // See: https://github.com/BurntSushi/ripgrep/issues/1207 // // Tests if encoding 'none' flag does treat file as raw bytes rgtest!(f1207_ignore_encoding, |dir: Dir, mut cmd: TestCommand| { // PCRE2 chokes on this test because it can't search invalid non-UTF-8 // and the point of this test is to search raw UTF-16. if dir.is_pcre2() { return; } dir.create_bytes( "foo", b"\xFF\xFE\x00\x62" ); cmd.arg("--encoding").arg("none").arg("-a").arg("\\x00").arg("foo"); eqnice!("\u{FFFD}\u{FFFD}\x00b\n", cmd.stdout()); }); ripgrep-11.0.2/tests/hay.rs010064400017500000144000000015021351372666500137650ustar0000000000000000pub const SHERLOCK: &'static str = "\ For the Doctor Watsons of this world, as opposed to the Sherlock Holmeses, success in the province of detective work must always be, to a very large extent, the result of luck. Sherlock Holmes can extract a clew from a wisp of straw or a flake of cigar ash; but Doctor Watson has to have it taken out for him and dusted, and exhibited clearly, with a label attached. "; pub const SHERLOCK_CRLF: &'static str = "\ For the Doctor Watsons of this world, as opposed to the Sherlock\r Holmeses, success in the province of detective work must always\r be, to a very large extent, the result of luck. Sherlock Holmes\r can extract a clew from a wisp of straw or a flake of cigar ash;\r but Doctor Watson has to have it taken out for him and dusted,\r and exhibited clearly, with a label attached.\r "; ripgrep-11.0.2/tests/json.rs010064400017500000144000000233301352064771400141530ustar0000000000000000use std::time; use serde_derive::Deserialize; use serde_json as json; use crate::hay::{SHERLOCK, SHERLOCK_CRLF}; use crate::util::{Dir, TestCommand}; #[derive(Clone, Debug, Deserialize, PartialEq, Eq)] #[serde(tag = "type", content = "data")] #[serde(rename_all = "snake_case")] enum Message { Begin(Begin), End(End), Match(Match), Context(Context), Summary(Summary), } impl Message { fn unwrap_begin(&self) -> Begin { match *self { Message::Begin(ref x) => x.clone(), ref x => panic!("expected Message::Begin but got {:?}", x), } } fn unwrap_end(&self) -> End { match *self { Message::End(ref x) => x.clone(), ref x => panic!("expected Message::End but got {:?}", x), } } fn unwrap_match(&self) -> Match { match *self { Message::Match(ref x) => x.clone(), ref x => panic!("expected Message::Match but got {:?}", x), } } fn unwrap_context(&self) -> Context { match *self { Message::Context(ref x) => x.clone(), ref x => panic!("expected Message::Context but got {:?}", x), } } fn unwrap_summary(&self) -> Summary { match *self { Message::Summary(ref x) => x.clone(), ref x => panic!("expected Message::Summary but got {:?}", x), } } } #[derive(Clone, Debug, Deserialize, PartialEq, Eq)] struct Begin { path: Option, } #[derive(Clone, Debug, Deserialize, PartialEq, Eq)] struct End { path: Option, binary_offset: Option, stats: Stats, } #[derive(Clone, Debug, Deserialize, PartialEq, Eq)] struct Summary { elapsed_total: Duration, stats: Stats, } #[derive(Clone, Debug, Deserialize, PartialEq, Eq)] struct Match { path: Option, lines: Data, line_number: Option, absolute_offset: u64, submatches: Vec, } #[derive(Clone, Debug, Deserialize, PartialEq, Eq)] struct Context { path: Option, lines: Data, line_number: Option, absolute_offset: u64, submatches: Vec, } #[derive(Clone, Debug, Deserialize, PartialEq, Eq)] struct SubMatch { #[serde(rename = "match")] m: Data, start: usize, end: usize, } #[derive(Clone, Debug, Deserialize, PartialEq, Eq)] #[serde(untagged)] enum Data { Text { text: String }, // This variant is used when the data isn't valid UTF-8. The bytes are // base64 encoded, so using a String here is OK. Bytes { bytes: String }, } impl Data { fn text(s: &str) -> Data { Data::Text { text: s.to_string() } } fn bytes(s: &str) -> Data { Data::Bytes { bytes: s.to_string() } } } #[derive(Clone, Debug, Deserialize, PartialEq, Eq)] struct Stats { elapsed: Duration, searches: u64, searches_with_match: u64, bytes_searched: u64, bytes_printed: u64, matched_lines: u64, matches: u64, } #[derive(Clone, Debug, Deserialize, PartialEq, Eq)] struct Duration { #[serde(flatten)] duration: time::Duration, human: String, } /// Decode JSON Lines into a Vec. If there was an error decoding, /// this function panics. fn json_decode(jsonlines: &str) -> Vec { json::Deserializer::from_str(jsonlines) .into_iter() .collect::, _>>() .unwrap() } rgtest!(basic, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--json").arg("-B1").arg("Sherlock Holmes").arg("sherlock"); let msgs = json_decode(&cmd.stdout()); assert_eq!( msgs[0].unwrap_begin(), Begin { path: Some(Data::text("sherlock")) } ); assert_eq!( msgs[1].unwrap_context(), Context { path: Some(Data::text("sherlock")), lines: Data::text( "Holmeses, success in the province of \ detective work must always\n", ), line_number: Some(2), absolute_offset: 65, submatches: vec![], } ); assert_eq!( msgs[2].unwrap_match(), Match { path: Some(Data::text("sherlock")), lines: Data::text( "be, to a very large extent, the result of luck. \ Sherlock Holmes\n", ), line_number: Some(3), absolute_offset: 129, submatches: vec![ SubMatch { m: Data::text("Sherlock Holmes"), start: 48, end: 63, }, ], } ); assert_eq!( msgs[3].unwrap_end().path, Some(Data::text("sherlock")) ); assert_eq!( msgs[3].unwrap_end().binary_offset, None ); assert_eq!( msgs[4].unwrap_summary().stats.searches_with_match, 1 ); assert_eq!( msgs[4].unwrap_summary().stats.bytes_printed, 494 ); }); #[cfg(unix)] rgtest!(notutf8, |dir: Dir, mut cmd: TestCommand| { use std::ffi::OsStr; use std::os::unix::ffi::OsStrExt; // This test does not work with PCRE2 because PCRE2 does not support the // `u` flag. if dir.is_pcre2() { return; } // macOS doesn't like this either... sigh. if cfg!(target_os = "macos") { return; } let name = &b"foo\xFFbar"[..]; let contents = &b"quux\xFFbaz"[..]; // APFS does not support creating files with invalid UTF-8 bytes, so just // skip the test if we can't create our file. Presumably we don't need this // check if we're already skipping it on macOS, but maybe other file // systems won't like this test either? if !dir.try_create_bytes(OsStr::from_bytes(name), contents).is_ok() { return; } cmd.arg("--json").arg(r"(?-u)\xFF"); let msgs = json_decode(&cmd.stdout()); assert_eq!( msgs[0].unwrap_begin(), Begin { path: Some(Data::bytes("Zm9v/2Jhcg==")) } ); assert_eq!( msgs[1].unwrap_match(), Match { path: Some(Data::bytes("Zm9v/2Jhcg==")), lines: Data::bytes("cXV1eP9iYXo="), line_number: Some(1), absolute_offset: 0, submatches: vec![ SubMatch { m: Data::bytes("/w=="), start: 4, end: 5, }, ], } ); }); rgtest!(notutf8_file, |dir: Dir, mut cmd: TestCommand| { use std::ffi::OsStr; // This test does not work with PCRE2 because PCRE2 does not support the // `u` flag. if dir.is_pcre2() { return; } let name = "foo"; let contents = &b"quux\xFFbaz"[..]; // APFS does not support creating files with invalid UTF-8 bytes, so just // skip the test if we can't create our file. if !dir.try_create_bytes(OsStr::new(name), contents).is_ok() { return; } cmd.arg("--json").arg(r"(?-u)\xFF"); let msgs = json_decode(&cmd.stdout()); assert_eq!( msgs[0].unwrap_begin(), Begin { path: Some(Data::text("foo")) } ); assert_eq!( msgs[1].unwrap_match(), Match { path: Some(Data::text("foo")), lines: Data::bytes("cXV1eP9iYXo="), line_number: Some(1), absolute_offset: 0, submatches: vec![ SubMatch { m: Data::bytes("/w=="), start: 4, end: 5, }, ], } ); }); // See: https://github.com/BurntSushi/ripgrep/issues/416 // // This test in particular checks that our match does _not_ include the `\r` // even though the '$' may be rewritten as '(?:\r??$)' and could thus include // `\r` in the match. rgtest!(crlf, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK_CRLF); cmd.arg("--json").arg("--crlf").arg(r"Sherlock$").arg("sherlock"); let msgs = json_decode(&cmd.stdout()); assert_eq!( msgs[1].unwrap_match().submatches[0].clone(), SubMatch { m: Data::text("Sherlock"), start: 56, end: 64, }, ); }); // See: https://github.com/BurntSushi/ripgrep/issues/1095 // // This test checks that we don't drop the \r\n in a matching line when --crlf // mode is enabled. rgtest!(r1095_missing_crlf, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "test\r\n"); // Check without --crlf flag. let msgs = json_decode(&cmd.arg("--json").arg("test").stdout()); assert_eq!(msgs.len(), 4); assert_eq!(msgs[1].unwrap_match().lines, Data::text("test\r\n")); // Now check with --crlf flag. let msgs = json_decode(&cmd.arg("--crlf").stdout()); assert_eq!(msgs.len(), 4); assert_eq!(msgs[1].unwrap_match().lines, Data::text("test\r\n")); }); // See: https://github.com/BurntSushi/ripgrep/issues/1095 // // This test checks that we don't return empty submatches when matching a `\n` // in CRLF mode. rgtest!(r1095_crlf_empty_match, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "test\r\n\n"); // Check without --crlf flag. let msgs = json_decode(&cmd.arg("-U").arg("--json").arg("\n").stdout()); assert_eq!(msgs.len(), 5); let m = msgs[1].unwrap_match(); assert_eq!(m.lines, Data::text("test\r\n")); assert_eq!(m.submatches[0].m, Data::text("\n")); let m = msgs[2].unwrap_match(); assert_eq!(m.lines, Data::text("\n")); assert_eq!(m.submatches[0].m, Data::text("\n")); // Now check with --crlf flag. let msgs = json_decode(&cmd.arg("--crlf").stdout()); let m = msgs[1].unwrap_match(); assert_eq!(m.lines, Data::text("test\r\n")); assert_eq!(m.submatches[0].m, Data::text("\n")); let m = msgs[2].unwrap_match(); assert_eq!(m.lines, Data::text("\n")); assert_eq!(m.submatches[0].m, Data::text("\n")); }); ripgrep-11.0.2/tests/macros.rs010064400017500000144000000030561352064771400144710ustar0000000000000000#[macro_export] macro_rules! rgtest { ($name:ident, $fun:expr) => { #[test] fn $name() { let (dir, cmd) = crate::util::setup(stringify!($name)); $fun(dir, cmd); if cfg!(feature = "pcre2") { let (dir, cmd) = crate::util::setup_pcre2(stringify!($name)); $fun(dir, cmd); } } } } #[macro_export] macro_rules! eqnice { ($expected:expr, $got:expr) => { let expected = &*$expected; let got = &*$got; if expected != got { panic!(" printed outputs differ! expected: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ got: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ", expected, got); } } } #[macro_export] macro_rules! eqnice_repr { ($expected:expr, $got:expr) => { let expected = &*$expected; let got = &*$got; if expected != got { panic!(" printed outputs differ! expected: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {:?} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ got: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {:?} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ", expected, got); } } } ripgrep-11.0.2/tests/misc.rs010064400017500000144000001007701352065255400141370ustar0000000000000000use crate::hay::SHERLOCK; use crate::util::{Dir, TestCommand, cmd_exists, sort_lines}; // This file contains "miscellaneous" tests that were either written before // features were tracked more explicitly, or were simply written without // linking them to a specific issue number. We should try to minimize the // addition of more tests in this file and instead add them to either the // regression test suite or the feature test suite (found in regression.rs and // feature.rs, respectively). rgtest!(single_file, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.arg("Sherlock").arg("sherlock").stdout()); }); rgtest!(dir, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.arg("Sherlock").stdout()); }); rgtest!(line_numbers, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); let expected = "\ 1:For the Doctor Watsons of this world, as opposed to the Sherlock 3:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.arg("-n").arg("Sherlock").arg("sherlock").stdout()); }); rgtest!(columns, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--column").arg("Sherlock").arg("sherlock"); let expected = "\ 1:57:For the Doctor Watsons of this world, as opposed to the Sherlock 3:49:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(with_filename, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-H").arg("Sherlock").arg("sherlock"); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(with_heading, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.args(&[ // This forces the issue since --with-filename is disabled by default // when searching one file. "--with-filename", "--heading", "Sherlock", "sherlock", ]); let expected = "\ sherlock For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(with_heading_default, |dir: Dir, mut cmd: TestCommand| { // Search two or more and get --with-filename enabled by default. // Use -j1 to get deterministic results. dir.create("sherlock", SHERLOCK); dir.create("foo", "Sherlock Holmes lives on Baker Street."); cmd.arg("-j1").arg("--heading").arg("Sherlock"); let expected = "\ foo Sherlock Holmes lives on Baker Street. sherlock For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(sort_lines(expected), sort_lines(&cmd.stdout())); }); rgtest!(inverted, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-v").arg("Sherlock").arg("sherlock"); let expected = "\ Holmeses, success in the province of detective work must always can extract a clew from a wisp of straw or a flake of cigar ash; but Doctor Watson has to have it taken out for him and dusted, and exhibited clearly, with a label attached. "; eqnice!(expected, cmd.stdout()); }); rgtest!(inverted_line_numbers, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-n").arg("-v").arg("Sherlock").arg("sherlock"); let expected = "\ 2:Holmeses, success in the province of detective work must always 4:can extract a clew from a wisp of straw or a flake of cigar ash; 5:but Doctor Watson has to have it taken out for him and dusted, 6:and exhibited clearly, with a label attached. "; eqnice!(expected, cmd.stdout()); }); rgtest!(case_insensitive, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-i").arg("sherlock").arg("sherlock"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(word, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-w").arg("as").arg("sherlock"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock "; eqnice!(expected, cmd.stdout()); }); rgtest!(line, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.args(&[ "-x", "Watson|and exhibited clearly, with a label attached.", "sherlock", ]); let expected = "\ and exhibited clearly, with a label attached. "; eqnice!(expected, cmd.stdout()); }); rgtest!(literal, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file", "blib\n()\nblab\n"); cmd.arg("-F").arg("()").arg("file"); eqnice!("()\n", cmd.stdout()); }); rgtest!(quiet, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-q").arg("Sherlock").arg("sherlock"); assert!(cmd.stdout().is_empty()); }); rgtest!(replace, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-r").arg("FooBar").arg("Sherlock").arg("sherlock"); let expected = "\ For the Doctor Watsons of this world, as opposed to the FooBar be, to a very large extent, the result of luck. FooBar Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(replace_groups, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.args(&[ "-r", "$2, $1", "([A-Z][a-z]+) ([A-Z][a-z]+)", "sherlock", ]); let expected = "\ For the Watsons, Doctor of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Holmes, Sherlock but Watson, Doctor has to have it taken out for him and dusted, "; eqnice!(expected, cmd.stdout()); }); rgtest!(replace_named_groups, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.args(&[ "-r", "$last, $first", "(?P[A-Z][a-z]+) (?P[A-Z][a-z]+)", "sherlock", ]); let expected = "\ For the Watsons, Doctor of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Holmes, Sherlock but Watson, Doctor has to have it taken out for him and dusted, "; eqnice!(expected, cmd.stdout()); }); rgtest!(replace_with_only_matching, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-o").arg("-r").arg("$1").arg(r"of (\w+)").arg("sherlock"); let expected = "\ this detective luck straw cigar "; eqnice!(expected, cmd.stdout()); }); rgtest!(file_types, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file.py", "Sherlock"); dir.create("file.rs", "Sherlock"); cmd.arg("-t").arg("rust").arg("Sherlock"); eqnice!("file.rs:Sherlock\n", cmd.stdout()); }); rgtest!(file_types_all, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file.py", "Sherlock"); cmd.arg("-t").arg("all").arg("Sherlock"); eqnice!("file.py:Sherlock\n", cmd.stdout()); }); rgtest!(file_types_negate, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.remove("sherlock"); dir.create("file.py", "Sherlock"); dir.create("file.rs", "Sherlock"); cmd.arg("-T").arg("rust").arg("Sherlock"); eqnice!("file.py:Sherlock\n", cmd.stdout()); }); rgtest!(file_types_negate_all, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file.py", "Sherlock"); cmd.arg("-T").arg("all").arg("Sherlock"); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(file_type_clear, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file.py", "Sherlock"); dir.create("file.rs", "Sherlock"); cmd.arg("--type-clear").arg("rust").arg("-t").arg("rust").arg("Sherlock"); cmd.assert_non_empty_stderr(); }); rgtest!(file_type_add, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file.py", "Sherlock"); dir.create("file.rs", "Sherlock"); dir.create("file.wat", "Sherlock"); cmd.args(&[ "--type-add", "wat:*.wat", "-t", "wat", "Sherlock", ]); eqnice!("file.wat:Sherlock\n", cmd.stdout()); }); rgtest!(file_type_add_compose, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file.py", "Sherlock"); dir.create("file.rs", "Sherlock"); dir.create("file.wat", "Sherlock"); cmd.args(&[ "--type-add", "wat:*.wat", "--type-add", "combo:include:wat,py", "-t", "combo", "Sherlock", ]); let expected = "\ file.py:Sherlock file.wat:Sherlock "; eqnice!(expected, sort_lines(&cmd.stdout())); }); rgtest!(glob, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file.py", "Sherlock"); dir.create("file.rs", "Sherlock"); cmd.arg("-g").arg("*.rs").arg("Sherlock"); eqnice!("file.rs:Sherlock\n", cmd.stdout()); }); rgtest!(glob_negate, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.remove("sherlock"); dir.create("file.py", "Sherlock"); dir.create("file.rs", "Sherlock"); cmd.arg("-g").arg("!*.rs").arg("Sherlock"); eqnice!("file.py:Sherlock\n", cmd.stdout()); }); rgtest!(glob_case_insensitive, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file.HTML", "Sherlock"); cmd.arg("--iglob").arg("*.html").arg("Sherlock"); eqnice!("file.HTML:Sherlock\n", cmd.stdout()); }); rgtest!(glob_case_sensitive, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file1.HTML", "Sherlock"); dir.create("file2.html", "Sherlock"); cmd.arg("--glob").arg("*.html").arg("Sherlock"); eqnice!("file2.html:Sherlock\n", cmd.stdout()); }); rgtest!(glob_always_case_insensitive, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file.HTML", "Sherlock"); cmd.args(&["--glob-case-insensitive", "--glob", "*.html", "Sherlock"]); eqnice!("file.HTML:Sherlock\n", cmd.stdout()); }); rgtest!(byte_offset_only_matching, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-b").arg("-o").arg("Sherlock"); let expected = "\ sherlock:56:Sherlock sherlock:177:Sherlock "; eqnice!(expected, cmd.stdout()); }); rgtest!(count, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--count").arg("Sherlock"); let expected = "sherlock:2\n"; eqnice!(expected, cmd.stdout()); }); rgtest!(count_matches, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--count-matches").arg("the"); let expected = "sherlock:4\n"; eqnice!(expected, cmd.stdout()); }); rgtest!(count_matches_inverted, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--count-matches").arg("--invert-match").arg("Sherlock"); let expected = "sherlock:4\n"; eqnice!(expected, cmd.stdout()); }); rgtest!(count_matches_via_only, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--count").arg("--only-matching").arg("the"); let expected = "sherlock:4\n"; eqnice!(expected, cmd.stdout()); }); rgtest!(files_with_matches, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--files-with-matches").arg("Sherlock"); let expected = "sherlock\n"; eqnice!(expected, cmd.stdout()); }); rgtest!(files_without_match, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("file.py", "foo"); cmd.arg("--files-without-match").arg("Sherlock"); let expected = "file.py\n"; eqnice!(expected, cmd.stdout()); }); rgtest!(after_context, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-A").arg("1").arg("Sherlock").arg("sherlock"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock Holmeses, success in the province of detective work must always be, to a very large extent, the result of luck. Sherlock Holmes can extract a clew from a wisp of straw or a flake of cigar ash; "; eqnice!(expected, cmd.stdout()); }); rgtest!(after_context_line_numbers, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-A").arg("1").arg("-n").arg("Sherlock").arg("sherlock"); let expected = "\ 1:For the Doctor Watsons of this world, as opposed to the Sherlock 2-Holmeses, success in the province of detective work must always 3:be, to a very large extent, the result of luck. Sherlock Holmes 4-can extract a clew from a wisp of straw or a flake of cigar ash; "; eqnice!(expected, cmd.stdout()); }); rgtest!(before_context, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-B").arg("1").arg("Sherlock").arg("sherlock"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock Holmeses, success in the province of detective work must always be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(before_context_line_numbers, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-B").arg("1").arg("-n").arg("Sherlock").arg("sherlock"); let expected = "\ 1:For the Doctor Watsons of this world, as opposed to the Sherlock 2-Holmeses, success in the province of detective work must always 3:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(context, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-C").arg("1").arg("world|attached").arg("sherlock"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock Holmeses, success in the province of detective work must always -- but Doctor Watson has to have it taken out for him and dusted, and exhibited clearly, with a label attached. "; eqnice!(expected, cmd.stdout()); }); rgtest!(context_line_numbers, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("-C").arg("1").arg("-n").arg("world|attached").arg("sherlock"); let expected = "\ 1:For the Doctor Watsons of this world, as opposed to the Sherlock 2-Holmeses, success in the province of detective work must always -- 5-but Doctor Watson has to have it taken out for him and dusted, 6:and exhibited clearly, with a label attached. "; eqnice!(expected, cmd.stdout()); }); rgtest!(max_filesize_parse_errro_length, |_: Dir, mut cmd: TestCommand| { cmd.arg("--max-filesize").arg("44444444444444444444"); cmd.assert_non_empty_stderr(); }); rgtest!(max_filesize_parse_error_suffix, |_: Dir, mut cmd: TestCommand| { cmd.arg("--max-filesize").arg("45k"); cmd.assert_non_empty_stderr(); }); rgtest!(max_filesize_parse_no_suffix, |dir: Dir, mut cmd: TestCommand| { dir.create_size("foo", 40); dir.create_size("bar", 60); cmd.arg("--max-filesize").arg("50").arg("--files"); eqnice!("foo\n", cmd.stdout()); }); rgtest!(max_filesize_parse_k_suffix, |dir: Dir, mut cmd: TestCommand| { dir.create_size("foo", 3048); dir.create_size("bar", 4100); cmd.arg("--max-filesize").arg("4K").arg("--files"); eqnice!("foo\n", cmd.stdout()); }); rgtest!(max_filesize_parse_m_suffix, |dir: Dir, mut cmd: TestCommand| { dir.create_size("foo", 1000000); dir.create_size("bar", 1400000); cmd.arg("--max-filesize").arg("1M").arg("--files"); eqnice!("foo\n", cmd.stdout()); }); rgtest!(max_filesize_suffix_overflow, |dir: Dir, mut cmd: TestCommand| { dir.create_size("foo", 1000000); // 2^35 * 2^30 would otherwise overflow cmd.arg("--max-filesize").arg("34359738368G").arg("--files"); cmd.assert_non_empty_stderr(); }); rgtest!(ignore_hidden, |dir: Dir, mut cmd: TestCommand| { dir.create(".sherlock", SHERLOCK); cmd.arg("Sherlock").assert_err(); }); rgtest!(no_ignore_hidden, |dir: Dir, mut cmd: TestCommand| { dir.create(".sherlock", SHERLOCK); cmd.arg("--hidden").arg("Sherlock"); let expected = "\ .sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock .sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(ignore_git, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create_dir(".git"); dir.create(".gitignore", "sherlock\n"); cmd.arg("Sherlock"); cmd.assert_err(); }); rgtest!(ignore_generic, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create(".ignore", "sherlock\n"); cmd.arg("Sherlock"); cmd.assert_err(); }); rgtest!(ignore_ripgrep, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create(".rgignore", "sherlock\n"); cmd.arg("Sherlock"); cmd.assert_err(); }); rgtest!(no_ignore, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create(".gitignore", "sherlock\n"); cmd.arg("--no-ignore").arg("Sherlock"); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(ignore_git_parent, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "sherlock\n"); dir.create_dir("foo"); dir.create("foo/sherlock", SHERLOCK); cmd.arg("Sherlock"); // Even though we search in foo/, which has no .gitignore, ripgrep will // traverse parent directories and respect the gitignore files found. cmd.current_dir(dir.path().join("foo")); cmd.assert_err(); }); rgtest!(ignore_git_parent_stop, |dir: Dir, mut cmd: TestCommand| { // This tests that searching parent directories for .gitignore files stops // after it sees a .git directory. To test this, we create this directory // hierarchy: // // .gitignore (contains `sherlock`) // foo/ // .git/ // bar/ // sherlock // // And we perform the search inside `foo/bar/`. ripgrep will stop looking // for .gitignore files after it sees `foo/.git/`, and therefore not // respect the top-level `.gitignore` containing `sherlock`. dir.create(".gitignore", "sherlock\n"); dir.create_dir("foo"); dir.create_dir("foo/.git"); dir.create_dir("foo/bar"); dir.create("foo/bar/sherlock", SHERLOCK); cmd.arg("Sherlock"); cmd.current_dir(dir.path().join("foo").join("bar")); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); // Like ignore_git_parent_stop, but with a .git file instead of a .git // directory. rgtest!(ignore_git_parent_stop_file, |dir: Dir, mut cmd: TestCommand| { // This tests that searching parent directories for .gitignore files stops // after it sees a .git *file*. A .git file is used for submodules. To test // this, we create this directory hierarchy: // // .gitignore (contains `sherlock`) // foo/ // .git // bar/ // sherlock // // And we perform the search inside `foo/bar/`. ripgrep will stop looking // for .gitignore files after it sees `foo/.git`, and therefore not // respect the top-level `.gitignore` containing `sherlock`. dir.create(".gitignore", "sherlock\n"); dir.create_dir("foo"); dir.create("foo/.git", ""); dir.create_dir("foo/bar"); dir.create("foo/bar/sherlock", SHERLOCK); cmd.arg("Sherlock"); cmd.current_dir(dir.path().join("foo").join("bar")); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(ignore_ripgrep_parent_no_stop, |dir: Dir, mut cmd: TestCommand| { // This is like the `ignore_git_parent_stop` test, except it checks that // ripgrep *doesn't* stop checking for .rgignore files. dir.create(".rgignore", "sherlock\n"); dir.create_dir("foo"); dir.create_dir("foo/.git"); dir.create_dir("foo/bar"); dir.create("foo/bar/sherlock", SHERLOCK); cmd.arg("Sherlock"); cmd.current_dir(dir.path().join("foo").join("bar")); // The top-level .rgignore applies. cmd.assert_err(); }); rgtest!(no_parent_ignore_git, |dir: Dir, mut cmd: TestCommand| { // Set up a directory hierarchy like this: // // .git/ // .gitignore // foo/ // .gitignore // sherlock // watson // // Where `.gitignore` contains `sherlock` and `foo/.gitignore` contains // `watson`. // // Now *do the search* from the foo directory. By default, ripgrep will // search parent directories for .gitignore files. The --no-ignore-parent // flag should prevent that. At the same time, the `foo/.gitignore` file // will still be respected (since the search is happening in `foo/`). // // In other words, we should only see results from `sherlock`, not from // `watson`. dir.create_dir(".git"); dir.create(".gitignore", "sherlock\n"); dir.create_dir("foo"); dir.create("foo/.gitignore", "watson\n"); dir.create("foo/sherlock", SHERLOCK); dir.create("foo/watson", SHERLOCK); cmd.arg("--no-ignore-parent").arg("Sherlock"); cmd.current_dir(dir.path().join("foo")); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(symlink_nofollow, |dir: Dir, mut cmd: TestCommand| { dir.create_dir("foo"); dir.create_dir("foo/bar"); dir.link_dir("foo/baz", "foo/bar/baz"); dir.create_dir("foo/baz"); dir.create("foo/baz/sherlock", SHERLOCK); cmd.arg("Sherlock"); cmd.current_dir(dir.path().join("foo/bar")); cmd.assert_err(); }); #[cfg(not(windows))] rgtest!(symlink_follow, |dir: Dir, mut cmd: TestCommand| { dir.create_dir("foo"); dir.create_dir("foo/bar"); dir.create_dir("foo/baz"); dir.create("foo/baz/sherlock", SHERLOCK); dir.link_dir("foo/baz", "foo/bar/baz"); cmd.arg("-L").arg("Sherlock"); cmd.current_dir(dir.path().join("foo/bar")); let expected = "\ baz/sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock baz/sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(unrestricted1, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create(".gitignore", "sherlock\n"); cmd.arg("-u").arg("Sherlock"); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(unrestricted2, |dir: Dir, mut cmd: TestCommand| { dir.create(".sherlock", SHERLOCK); cmd.arg("-uu").arg("Sherlock"); let expected = "\ .sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock .sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(unrestricted3, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("hay", "foo\x00bar\nfoo\x00baz\n"); cmd.arg("-uuu").arg("foo"); let expected = "\ Binary file hay matches (found \"\\u{0}\" byte around offset 3) "; eqnice!(expected, cmd.stdout()); }); rgtest!(vimgrep, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--vimgrep").arg("Sherlock|Watson"); let expected = "\ sherlock:1:16:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:1:57:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:3:49:be, to a very large extent, the result of luck. Sherlock Holmes sherlock:5:12:but Doctor Watson has to have it taken out for him and dusted, "; eqnice!(expected, cmd.stdout()); }); rgtest!(vimgrep_no_line, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--vimgrep").arg("-N").arg("Sherlock|Watson"); let expected = "\ sherlock:16:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:57:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:49:be, to a very large extent, the result of luck. Sherlock Holmes sherlock:12:but Doctor Watson has to have it taken out for him and dusted, "; eqnice!(expected, cmd.stdout()); }); rgtest!(vimgrep_no_line_no_column, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.arg("--vimgrep").arg("-N").arg("--no-column").arg("Sherlock|Watson"); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes sherlock:but Doctor Watson has to have it taken out for him and dusted, "; eqnice!(expected, cmd.stdout()); }); rgtest!(preprocessing, |dir: Dir, mut cmd: TestCommand| { if !cmd_exists("xzcat") { return; } dir.create_bytes("sherlock.xz", include_bytes!("./data/sherlock.xz")); cmd.arg("--pre").arg("xzcat").arg("Sherlock").arg("sherlock.xz"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(preprocessing_glob, |dir: Dir, mut cmd: TestCommand| { if !cmd_exists("xzcat") { return; } dir.create("sherlock", SHERLOCK); dir.create_bytes("sherlock.xz", include_bytes!("./data/sherlock.xz")); cmd.args(&["--pre", "xzcat", "--pre-glob", "*.xz", "Sherlock"]); let expected = "\ sherlock.xz:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock.xz:be, to a very large extent, the result of luck. Sherlock Holmes sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(sort_lines(expected), sort_lines(&cmd.stdout())); }); rgtest!(compressed_gzip, |dir: Dir, mut cmd: TestCommand| { if !cmd_exists("gzip") { return; } dir.create_bytes("sherlock.gz", include_bytes!("./data/sherlock.gz")); cmd.arg("-z").arg("Sherlock").arg("sherlock.gz"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(compressed_bzip2, |dir: Dir, mut cmd: TestCommand| { if !cmd_exists("bzip2") { return; } dir.create_bytes("sherlock.bz2", include_bytes!("./data/sherlock.bz2")); cmd.arg("-z").arg("Sherlock").arg("sherlock.bz2"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(compressed_xz, |dir: Dir, mut cmd: TestCommand| { if !cmd_exists("xz") { return; } dir.create_bytes("sherlock.xz", include_bytes!("./data/sherlock.xz")); cmd.arg("-z").arg("Sherlock").arg("sherlock.xz"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(compressed_lz4, |dir: Dir, mut cmd: TestCommand| { if !cmd_exists("lz4") { return; } dir.create_bytes("sherlock.lz4", include_bytes!("./data/sherlock.lz4")); cmd.arg("-z").arg("Sherlock").arg("sherlock.lz4"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(compressed_lzma, |dir: Dir, mut cmd: TestCommand| { if !cmd_exists("xz") { return; } dir.create_bytes("sherlock.lzma", include_bytes!("./data/sherlock.lzma")); cmd.arg("-z").arg("Sherlock").arg("sherlock.lzma"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(compressed_brotli, |dir: Dir, mut cmd: TestCommand| { if !cmd_exists("brotli") { return; } dir.create_bytes("sherlock.br", include_bytes!("./data/sherlock.br")); cmd.arg("-z").arg("Sherlock").arg("sherlock.br"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(compressed_zstd, |dir: Dir, mut cmd: TestCommand| { if !cmd_exists("zstd") { return; } dir.create_bytes("sherlock.zst", include_bytes!("./data/sherlock.zst")); cmd.arg("-z").arg("Sherlock").arg("sherlock.zst"); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock be, to a very large extent, the result of luck. Sherlock Holmes "; eqnice!(expected, cmd.stdout()); }); rgtest!(compressed_failing_gzip, |dir: Dir, mut cmd: TestCommand| { if !cmd_exists("gzip") { return; } dir.create("sherlock.gz", SHERLOCK); cmd.arg("-z").arg("Sherlock").arg("sherlock.gz"); cmd.assert_non_empty_stderr(); }); rgtest!(binary_convert, |dir: Dir, mut cmd: TestCommand| { dir.create("file", "foo\x00bar\nfoo\x00baz\n"); cmd.arg("--no-mmap").arg("foo").arg("file"); let expected = "\ Binary file matches (found \"\\u{0}\" byte around offset 3) "; eqnice!(expected, cmd.stdout()); }); rgtest!(binary_convert_mmap, |dir: Dir, mut cmd: TestCommand| { dir.create("file", "foo\x00bar\nfoo\x00baz\n"); cmd.arg("--mmap").arg("foo").arg("file"); let expected = "\ Binary file matches (found \"\\u{0}\" byte around offset 3) "; eqnice!(expected, cmd.stdout()); }); rgtest!(binary_quit, |dir: Dir, mut cmd: TestCommand| { dir.create("file", "foo\x00bar\nfoo\x00baz\n"); cmd.arg("--no-mmap").arg("foo").arg("-gfile"); cmd.assert_err(); }); rgtest!(binary_quit_mmap, |dir: Dir, mut cmd: TestCommand| { dir.create("file", "foo\x00bar\nfoo\x00baz\n"); cmd.arg("--mmap").arg("foo").arg("-gfile"); cmd.assert_err(); }); // The following two tests show a discrepancy in search results between // searching with memory mapped files and stream searching. Stream searching // uses a heuristic (that GNU grep also uses) where NUL bytes are replaced with // the EOL terminator, which tends to avoid allocating large amounts of memory // for really long "lines." The memory map searcher has no need to worry about // such things, and more than that, it would be pretty hard for it to match the // semantics of streaming search in this case. // // Binary files with lots of NULs aren't really part of the use case of ripgrep // (or any other grep-like tool for that matter), so we shouldn't feel too bad // about it. rgtest!(binary_search_mmap, |dir: Dir, mut cmd: TestCommand| { dir.create("file", "foo\x00bar\nfoo\x00baz\n"); cmd.arg("-a").arg("--mmap").arg("foo").arg("file"); eqnice!("foo\x00bar\nfoo\x00baz\n", cmd.stdout()); }); rgtest!(binary_search_no_mmap, |dir: Dir, mut cmd: TestCommand| { dir.create("file", "foo\x00bar\nfoo\x00baz\n"); cmd.arg("-a").arg("--no-mmap").arg("foo").arg("file"); eqnice!("foo\x00bar\nfoo\x00baz\n", cmd.stdout()); }); rgtest!(files, |dir: Dir, mut cmd: TestCommand| { dir.create("file", ""); dir.create_dir("dir"); dir.create("dir/file", ""); cmd.arg("--files"); eqnice!(sort_lines("file\ndir/file\n"), sort_lines(&cmd.stdout())); }); rgtest!(type_list, |_: Dir, mut cmd: TestCommand| { cmd.arg("--type-list"); // This can change over time, so just make sure we print something. assert!(!cmd.stdout().is_empty()); }); ripgrep-11.0.2/tests/multiline.rs010064400017500000144000000073661352064771400152170ustar0000000000000000use crate::hay::SHERLOCK; use crate::util::{Dir, TestCommand}; // This tests that multiline matches that span multiple lines, but where // multiple matches may begin and end on the same line work correctly. rgtest!(overlap1, |dir: Dir, mut cmd: TestCommand| { dir.create("test", "xxx\nabc\ndefxxxabc\ndefxxx\nxxx"); cmd.arg("-n").arg("-U").arg("abc\ndef").arg("test"); eqnice!("2:abc\n3:defxxxabc\n4:defxxx\n", cmd.stdout()); }); // Like overlap1, but tests the case where one match ends at precisely the same // location at which the next match begins. rgtest!(overlap2, |dir: Dir, mut cmd: TestCommand| { dir.create("test", "xxx\nabc\ndefabc\ndefxxx\nxxx"); cmd.arg("-n").arg("-U").arg("abc\ndef").arg("test"); eqnice!("2:abc\n3:defabc\n4:defxxx\n", cmd.stdout()); }); // Tests that even in a multiline search, a '.' does not match a newline. rgtest!(dot_no_newline, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.args(&[ "-n", "-U", "of this world.+detective work", "sherlock", ]); cmd.assert_err(); }); // Tests that the --multiline-dotall flag causes '.' to match a newline. rgtest!(dot_all, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.args(&[ "-n", "-U", "--multiline-dotall", "of this world.+detective work", "sherlock", ]); let expected = "\ 1:For the Doctor Watsons of this world, as opposed to the Sherlock 2:Holmeses, success in the province of detective work must always "; eqnice!(expected, cmd.stdout()); }); // Tests that --only-matching works in multiline mode. rgtest!(only_matching, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.args(&[ "-n", "-U", "--only-matching", r"Watson|Sherlock\p{Any}+?Holmes", "sherlock", ]); let expected = "\ 1:Watson 1:Sherlock 2:Holmes 3:Sherlock Holmes 5:Watson "; eqnice!(expected, cmd.stdout()); }); // Tests that --vimgrep works in multiline mode. rgtest!(vimgrep, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.args(&[ "-n", "-U", "--vimgrep", r"Watson|Sherlock\p{Any}+?Holmes", "sherlock", ]); let expected = "\ sherlock:1:16:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:1:57:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:2:57:Holmeses, success in the province of detective work must always sherlock:3:49:be, to a very large extent, the result of luck. Sherlock Holmes sherlock:5:12:but Doctor Watson has to have it taken out for him and dusted, "; eqnice!(expected, cmd.stdout()); }); // Tests that multiline search works when reading from stdin. This is an // important test because multiline search must read the entire contents of // what it is searching into memory before executing the search. rgtest!(stdin, |_: Dir, mut cmd: TestCommand| { cmd.args(&[ "-n", "-U", r"of this world\p{Any}+?detective work", ]); let expected = "\ 1:For the Doctor Watsons of this world, as opposed to the Sherlock 2:Holmeses, success in the province of detective work must always "; eqnice!(expected, cmd.pipe(SHERLOCK.as_bytes())); }); // Test that multiline search and contextual matches work. rgtest!(context, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); cmd.args(&[ "-n", "-U", "-C1", r"detective work\p{Any}+?result of luck", "sherlock", ]); let expected = "\ 1-For the Doctor Watsons of this world, as opposed to the Sherlock 2:Holmeses, success in the province of detective work must always 3:be, to a very large extent, the result of luck. Sherlock Holmes 4-can extract a clew from a wisp of straw or a flake of cigar ash; "; eqnice!(expected, cmd.stdout()); }); ripgrep-11.0.2/tests/regression.rs010064400017500000144000000561501352065447300153700ustar0000000000000000use crate::hay::SHERLOCK; use crate::util::{Dir, TestCommand, sort_lines}; // See: https://github.com/BurntSushi/ripgrep/issues/16 rgtest!(r16, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "ghi/"); dir.create_dir("ghi"); dir.create_dir("def/ghi"); dir.create("ghi/toplevel.txt", "xyz"); dir.create("def/ghi/subdir.txt", "xyz"); cmd.arg("xyz").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/25 rgtest!(r25, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "/llvm/"); dir.create_dir("src/llvm"); dir.create("src/llvm/foo", "test"); cmd.arg("test"); eqnice!("src/llvm/foo:test\n", cmd.stdout()); cmd.current_dir(dir.path().join("src")); eqnice!("llvm/foo:test\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/30 rgtest!(r30, |dir: Dir, mut cmd: TestCommand| { dir.create(".gitignore", "vendor/**\n!vendor/manifest"); dir.create_dir("vendor"); dir.create("vendor/manifest", "test"); eqnice!("vendor/manifest:test\n", cmd.arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/49 rgtest!(r49, |dir: Dir, mut cmd: TestCommand| { dir.create(".gitignore", "foo/bar"); dir.create_dir("test/foo/bar"); dir.create("test/foo/bar/baz", "test"); cmd.arg("xyz").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/50 rgtest!(r50, |dir: Dir, mut cmd: TestCommand| { dir.create(".gitignore", "XXX/YYY/"); dir.create_dir("abc/def/XXX/YYY"); dir.create_dir("ghi/XXX/YYY"); dir.create("abc/def/XXX/YYY/bar", "test"); dir.create("ghi/XXX/YYY/bar", "test"); cmd.arg("xyz").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/64 rgtest!(r64, |dir: Dir, mut cmd: TestCommand| { dir.create_dir("dir"); dir.create_dir("foo"); dir.create("dir/abc", ""); dir.create("foo/abc", ""); eqnice!("foo/abc\n", cmd.arg("--files").arg("foo").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/65 rgtest!(r65, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "a/"); dir.create_dir("a"); dir.create("a/foo", "xyz"); dir.create("a/bar", "xyz"); cmd.arg("xyz").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/67 rgtest!(r67, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "/*\n!/dir"); dir.create_dir("dir"); dir.create_dir("foo"); dir.create("foo/bar", "test"); dir.create("dir/bar", "test"); eqnice!("dir/bar:test\n", cmd.arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/87 rgtest!(r87, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "foo\n**no-vcs**"); dir.create("foo", "test"); cmd.arg("test").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/90 rgtest!(r90, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "!.foo"); dir.create(".foo", "test"); eqnice!(".foo:test\n", cmd.arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/93 rgtest!(r93, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "192.168.1.1"); eqnice!("foo:192.168.1.1\n", cmd.arg(r"(\d{1,3}\.){3}\d{1,3}").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/99 rgtest!(r99, |dir: Dir, mut cmd: TestCommand| { dir.create("foo1", "test"); dir.create("foo2", "zzz"); dir.create("bar", "test"); eqnice!( sort_lines("bar\ntest\n\nfoo1\ntest\n"), sort_lines(&cmd.arg("-j1").arg("--heading").arg("test").stdout()) ); }); // See: https://github.com/BurntSushi/ripgrep/issues/105 rgtest!(r105_part1, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "zztest"); eqnice!("foo:1:3:zztest\n", cmd.arg("--vimgrep").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/105 rgtest!(r105_part2, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "zztest"); eqnice!("foo:1:3:zztest\n", cmd.arg("--column").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/127 rgtest!(r127, |dir: Dir, mut cmd: TestCommand| { // Set up a directory hierarchy like this: // // .gitignore // foo/ // sherlock // watson // // Where `.gitignore` contains `foo/sherlock`. // // ripgrep should ignore 'foo/sherlock' giving us results only from // 'foo/watson' but on Windows ripgrep will include both 'foo/sherlock' and // 'foo/watson' in the search results. dir.create_dir(".git"); dir.create(".gitignore", "foo/sherlock\n"); dir.create_dir("foo"); dir.create("foo/sherlock", SHERLOCK); dir.create("foo/watson", SHERLOCK); let expected = "\ foo/watson:For the Doctor Watsons of this world, as opposed to the Sherlock foo/watson:be, to a very large extent, the result of luck. Sherlock Holmes "; assert_eq!(expected, cmd.arg("Sherlock").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/128 rgtest!(r128, |dir: Dir, mut cmd: TestCommand| { dir.create_bytes("foo", b"01234567\x0b\n\x0b\n\x0b\n\x0b\nx"); eqnice!("foo:5:x\n", cmd.arg("-n").arg("x").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/131 // // TODO(burntsushi): Darwin doesn't like this test for some reason. Probably // due to the weird file path. #[cfg(not(target_os = "macos"))] rgtest!(r131, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "TopÑapa"); dir.create("TopÑapa", "test"); cmd.arg("test").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/137 // // TODO(burntsushi): Figure out how to make this test work on Windows. Right // now it gives "access denied" errors when trying to create a file symlink. // For now, disable test on Windows. #[cfg(not(windows))] rgtest!(r137, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.link_file("sherlock", "sym1"); dir.link_file("sherlock", "sym2"); let expected = "\ ./sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock ./sherlock:be, to a very large extent, the result of luck. Sherlock Holmes sym1:For the Doctor Watsons of this world, as opposed to the Sherlock sym1:be, to a very large extent, the result of luck. Sherlock Holmes sym2:For the Doctor Watsons of this world, as opposed to the Sherlock sym2:be, to a very large extent, the result of luck. Sherlock Holmes "; cmd.arg("-j1").arg("Sherlock").arg("./").arg("sym1").arg("sym2"); eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/156 rgtest!(r156, |dir: Dir, mut cmd: TestCommand| { let expected = r#"#parse('widgets/foo_bar_macros.vm') #parse ( 'widgets/mobile/foo_bar_macros.vm' ) #parse ("widgets/foobarhiddenformfields.vm") #parse ( "widgets/foo_bar_legal.vm" ) #include( 'widgets/foo_bar_tips.vm' ) #include('widgets/mobile/foo_bar_macros.vm') #include ("widgets/mobile/foo_bar_resetpw.vm") #parse('widgets/foo-bar-macros.vm') #parse ( 'widgets/mobile/foo-bar-macros.vm' ) #parse ("widgets/foo-bar-hiddenformfields.vm") #parse ( "widgets/foo-bar-legal.vm" ) #include( 'widgets/foo-bar-tips.vm' ) #include('widgets/mobile/foo-bar-macros.vm') #include ("widgets/mobile/foo-bar-resetpw.vm") "#; dir.create("testcase.txt", expected); cmd.arg("-N"); cmd.arg(r#"#(?:parse|include)\s*\(\s*(?:"|')[./A-Za-z_-]+(?:"|')"#); cmd.arg("testcase.txt"); eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/184 rgtest!(r184, |dir: Dir, mut cmd: TestCommand| { dir.create(".gitignore", ".*"); dir.create_dir("foo/bar"); dir.create("foo/bar/baz", "test"); cmd.arg("test"); eqnice!("foo/bar/baz:test\n", cmd.stdout()); cmd.current_dir(dir.path().join("./foo/bar")); eqnice!("baz:test\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/199 rgtest!(r199, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "tEsT"); eqnice!("foo:tEsT\n", cmd.arg("--smart-case").arg(r"\btest\b").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/206 rgtest!(r206, |dir: Dir, mut cmd: TestCommand| { dir.create_dir("foo"); dir.create("foo/bar.txt", "test"); cmd.arg("test").arg("-g").arg("*.txt"); eqnice!("foo/bar.txt:test\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/210 #[cfg(unix)] rgtest!(r210, |dir: Dir, mut cmd: TestCommand| { use std::ffi::OsStr; use std::os::unix::ffi::OsStrExt; let badutf8 = OsStr::from_bytes(&b"foo\xffbar"[..]); // APFS does not support creating files with invalid UTF-8 bytes. // https://github.com/BurntSushi/ripgrep/issues/559 if dir.try_create(badutf8, "test").is_ok() { cmd.arg("-H").arg("test").arg(badutf8); assert_eq!(b"foo\xffbar:test\n".to_vec(), cmd.output().stdout); } }); // See: https://github.com/BurntSushi/ripgrep/issues/228 rgtest!(r228, |dir: Dir, mut cmd: TestCommand| { dir.create_dir("foo"); cmd.arg("--ignore-file").arg("foo").arg("test").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/229 rgtest!(r229, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "economie"); cmd.arg("-S").arg("[E]conomie").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/251 rgtest!(r251, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "привет\nПривет\nПрИвЕт"); let expected = "foo:привет\nfoo:Привет\nfoo:ПрИвЕт\n"; eqnice!(expected, cmd.arg("-i").arg("привет").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/256 #[cfg(not(windows))] rgtest!(r256, |dir: Dir, mut cmd: TestCommand| { dir.create_dir("bar"); dir.create("bar/baz", "test"); dir.link_dir("bar", "foo"); eqnice!("foo/baz:test\n", cmd.arg("test").arg("foo").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/256 #[cfg(not(windows))] rgtest!(r256_j1, |dir: Dir, mut cmd: TestCommand| { dir.create_dir("bar"); dir.create("bar/baz", "test"); dir.link_dir("bar", "foo"); eqnice!("foo/baz:test\n", cmd.arg("-j1").arg("test").arg("foo").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/270 rgtest!(r270, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "-test"); cmd.arg("-e").arg("-test"); eqnice!("foo:-test\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/279 rgtest!(r279, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "test"); eqnice!("", cmd.arg("-q").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/391 rgtest!(r391, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create("lock", ""); dir.create("bar.py", ""); dir.create(".git/packed-refs", ""); dir.create(".git/description", ""); cmd.args(&[ "--no-ignore", "--hidden", "--follow", "--files", "--glob", "!{.git,node_modules,plugged}/**", "--glob", "*.{js,json,php,md,styl,scss,sass,pug,html,config,py,cpp,c,go,hs}", ]); eqnice!("bar.py\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/405 rgtest!(r405, |dir: Dir, mut cmd: TestCommand| { dir.create_dir("foo/bar"); dir.create_dir("bar/foo"); dir.create("foo/bar/file1.txt", "test"); dir.create("bar/foo/file2.txt", "test"); cmd.arg("-g").arg("!/foo/**").arg("test"); eqnice!("bar/foo/file2.txt:test\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/428 #[cfg(not(windows))] rgtest!(r428_color_context_path, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", "foo\nbar"); cmd.args(&[ "-A1", "-H", "--no-heading", "-N", "--colors=match:none", "--color=always", "foo", ]); let expected = format!( "{colored_path}:foo\n{colored_path}-bar\n", colored_path= "\x1b\x5b\x30\x6d\x1b\x5b\x33\x35\x6dsherlock\x1b\x5b\x30\x6d" ); eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/428 rgtest!(r428_unrecognized_style, |_: Dir, mut cmd: TestCommand| { cmd.arg("--colors=match:style:").arg("Sherlock"); cmd.assert_err(); let output = cmd.cmd().output().unwrap(); let stderr = String::from_utf8_lossy(&output.stderr); let expected = "\ unrecognized style attribute ''. Choose from: nobold, bold, nointense, \ intense, nounderline, underline. "; eqnice!(expected, stderr); }); // See: https://github.com/BurntSushi/ripgrep/issues/451 rgtest!(r451_only_matching_as_in_issue, |dir: Dir, mut cmd: TestCommand| { dir.create("digits.txt", "1 2 3\n"); cmd.arg("--only-matching").arg(r"[0-9]+").arg("digits.txt"); let expected = "\ 1 2 3 "; eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/451 rgtest!(r451_only_matching, |dir: Dir, mut cmd: TestCommand| { dir.create("digits.txt", "1 2 3\n123\n"); cmd.args(&[ "--only-matching", "--column", r"[0-9]", "digits.txt", ]); let expected = "\ 1:1:1 1:3:2 1:5:3 2:1:1 2:2:2 2:3:3 "; eqnice!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/483 rgtest!(r483_matching_no_stdout, |dir: Dir, mut cmd: TestCommand| { dir.create("file.py", ""); cmd.arg("--quiet").arg("--files").arg("--glob").arg("*.py"); eqnice!("", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/483 rgtest!(r483_non_matching_exit_code, |dir: Dir, mut cmd: TestCommand| { dir.create("file.rs", ""); cmd.arg("--quiet").arg("--files").arg("--glob").arg("*.py"); cmd.assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/493 rgtest!(r493, |dir: Dir, mut cmd: TestCommand| { dir.create("input.txt", "peshwaship 're seminomata"); cmd.arg("-o").arg(r"\b 're \b").arg("input.txt"); assert_eq!(" 're \n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/506 rgtest!(r506_word_not_parenthesized, |dir: Dir, mut cmd: TestCommand| { dir.create("wb.txt", "min minimum amin\nmax maximum amax"); cmd.arg("-w").arg("-o").arg("min|max").arg("wb.txt"); eqnice!("min\nmax\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/553 rgtest!(r553_switch, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); let expected = "\ sherlock:For the Doctor Watsons of this world, as opposed to the Sherlock sherlock:be, to a very large extent, the result of luck. Sherlock Holmes "; cmd.arg("-i").arg("sherlock"); eqnice!(expected, cmd.stdout()); // Repeat the `i` flag to make sure everything still works. eqnice!(expected, cmd.arg("-i").stdout()); }); rgtest!(r553_flag, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock Holmeses, success in the province of detective work must always -- but Doctor Watson has to have it taken out for him and dusted, and exhibited clearly, with a label attached. "; cmd.arg("-C").arg("1").arg(r"world|attached").arg("sherlock"); eqnice!(expected, cmd.stdout()); let expected = "\ For the Doctor Watsons of this world, as opposed to the Sherlock and exhibited clearly, with a label attached. "; eqnice!(expected, cmd.arg("-C").arg("0").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/568 rgtest!(r568_leading_hyphen_option_args, |dir: Dir, mut cmd: TestCommand| { dir.create("file", "foo bar -baz\n"); cmd.arg("-e-baz").arg("-e").arg("-baz").arg("file"); eqnice!("foo bar -baz\n", cmd.stdout()); let mut cmd = dir.command(); cmd.arg("-rni").arg("bar").arg("file"); eqnice!("foo ni -baz\n", cmd.stdout()); let mut cmd = dir.command(); cmd.arg("-r").arg("-n").arg("-i").arg("bar").arg("file"); eqnice!("foo -n -baz\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/599 // // This test used to check that we emitted color escape sequences even for // empty matches, but with the addition of the JSON output format, clients no // longer need to rely on escape sequences to parse matches. Therefore, we no // longer emit useless escape sequences. rgtest!(r599, |dir: Dir, mut cmd: TestCommand| { dir.create("input.txt", "\n\ntest\n"); cmd.args(&[ "--color", "ansi", "--colors", "path:none", "--colors", "line:none", "--colors", "match:fg:red", "--colors", "match:style:nobold", "--line-number", r"^$", "input.txt", ]); let expected = "\ 1: 2: "; eqnice_repr!(expected, cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/693 rgtest!(r693_context_in_contextless_mode, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "xyz\n"); dir.create("bar", "xyz\n"); cmd.arg("-C1").arg("-c").arg("--sort-files").arg("xyz"); eqnice!("bar:1\nfoo:1\n", cmd.stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/807 rgtest!(r807, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", ".a/b"); dir.create_dir(".a/b"); dir.create_dir(".a/c"); dir.create(".a/b/file", "test"); dir.create(".a/c/file", "test"); eqnice!(".a/c/file:test\n", cmd.arg("--hidden").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/900 rgtest!(r900, |dir: Dir, mut cmd: TestCommand| { dir.create("sherlock", SHERLOCK); dir.create("pat", ""); cmd.arg("-fpat").arg("sherlock").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/1064 rgtest!(r1064, |dir: Dir, mut cmd: TestCommand| { dir.create("input", "abc"); eqnice!("input:abc\n", cmd.arg("a(.*c)").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/1174 rgtest!(r1098, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "a**b"); dir.create("afoob", "test"); cmd.arg("test").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/1130 rgtest!(r1130, |dir: Dir, mut cmd: TestCommand| { dir.create("foo", "test"); eqnice!( "foo\n", cmd.arg("--files-with-matches").arg("test").arg("foo").stdout() ); let mut cmd = dir.command(); eqnice!( "foo\n", cmd.arg("--files-without-match").arg("nada").arg("foo").stdout() ); }); // See: https://github.com/BurntSushi/ripgrep/issues/1159 rgtest!(r1159_invalid_flag, |_: Dir, mut cmd: TestCommand| { cmd.arg("--wat").assert_exit_code(2); }); // See: https://github.com/BurntSushi/ripgrep/issues/1159 rgtest!(r1159_exit_status, |dir: Dir, _: TestCommand| { dir.create("foo", "test"); // search with a match gets 0 exit status. let mut cmd = dir.command(); cmd.arg("test").assert_exit_code(0); // search with --quiet and a match gets 0 exit status. let mut cmd = dir.command(); cmd.arg("-q").arg("test").assert_exit_code(0); // search with a match and an error gets 2 exit status. let mut cmd = dir.command(); cmd.arg("test").arg("no-file").assert_exit_code(2); // search with a match in --quiet mode and an error gets 0 exit status. let mut cmd = dir.command(); cmd.arg("-q").arg("test").arg("foo").arg("no-file").assert_exit_code(0); // search with no match gets 1 exit status. let mut cmd = dir.command(); cmd.arg("nada").assert_exit_code(1); // search with --quiet and no match gets 1 exit status. let mut cmd = dir.command(); cmd.arg("-q").arg("nada").assert_exit_code(1); // search with no match and an error gets 2 exit status. let mut cmd = dir.command(); cmd.arg("nada").arg("no-file").assert_exit_code(2); // search with no match in --quiet mode and an error gets 2 exit status. let mut cmd = dir.command(); cmd.arg("-q").arg("nada").arg("foo").arg("no-file").assert_exit_code(2); }); // See: https://github.com/BurntSushi/ripgrep/issues/1163 rgtest!(r1163, |dir: Dir, mut cmd: TestCommand| { dir.create("bom.txt", "\u{FEFF}test123\ntest123"); eqnice!( "bom.txt:test123\nbom.txt:test123\n", cmd.arg("^test123").stdout() ); }); // See: https://github.com/BurntSushi/ripgrep/issues/1164 rgtest!(r1164, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "myfile"); dir.create("MYFILE", "test"); cmd.arg("--ignore-file-case-insensitive").arg("test").assert_err(); eqnice!( "MYFILE:test\n", cmd.arg("--no-ignore-file-case-insensitive").stdout() ); }); // See: https://github.com/BurntSushi/ripgrep/issues/1173 rgtest!(r1173, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "**"); dir.create("foo", "test"); cmd.arg("test").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/1174 rgtest!(r1174, |dir: Dir, mut cmd: TestCommand| { dir.create_dir(".git"); dir.create(".gitignore", "**/**/*"); dir.create_dir("a"); dir.create("a/foo", "test"); cmd.arg("test").assert_err(); }); // See: https://github.com/BurntSushi/ripgrep/issues/1176 rgtest!(r1176_literal_file, |dir: Dir, mut cmd: TestCommand| { dir.create("patterns", "foo(bar\n"); dir.create("test", "foo(bar"); eqnice!( "foo(bar\n", cmd.arg("-F").arg("-f").arg("patterns").arg("test").stdout() ); }); // See: https://github.com/BurntSushi/ripgrep/issues/1176 rgtest!(r1176_line_regex, |dir: Dir, mut cmd: TestCommand| { dir.create("patterns", "foo\n"); dir.create("test", "foobar\nfoo\nbarfoo\n"); eqnice!( "foo\n", cmd.arg("-x").arg("-f").arg("patterns").arg("test").stdout() ); }); // See: https://github.com/BurntSushi/ripgrep/issues/1203 rgtest!(r1203_reverse_suffix_literal, |dir: Dir, _: TestCommand| { dir.create("test", "153.230000\n"); let mut cmd = dir.command(); eqnice!("153.230000\n", cmd.arg(r"\d\d\d00").arg("test").stdout()); let mut cmd = dir.command(); eqnice!("153.230000\n", cmd.arg(r"\d\d\d000").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/1223 rgtest!(r1223_no_dir_check_for_default_path, |dir: Dir, mut cmd: TestCommand| { dir.create_dir("-"); dir.create("a.json", "{}"); dir.create("a.txt", "some text"); eqnice!( "a.json\na.txt\n", sort_lines(&cmd.arg("a").pipe(b"a.json\na.txt")) ); }); // See: https://github.com/BurntSushi/ripgrep/issues/1259 rgtest!(r1259_drop_last_byte_nonl, |dir: Dir, mut cmd: TestCommand| { dir.create("patterns-nonl", "[foo]"); dir.create("patterns-nl", "[foo]\n"); dir.create("test", "fz"); eqnice!("fz\n", cmd.arg("-f").arg("patterns-nonl").arg("test").stdout()); cmd = dir.command(); eqnice!("fz\n", cmd.arg("-f").arg("patterns-nl").arg("test").stdout()); }); // See: https://github.com/BurntSushi/ripgrep/issues/1334 rgtest!(r1334_crazy_literals, |dir: Dir, mut cmd: TestCommand| { dir.create("patterns", &"1.208.0.0/12\n".repeat(40)); dir.create("corpus", "1.208.0.0/12\n"); eqnice!( "1.208.0.0/12\n", cmd.arg("-Ff").arg("patterns").arg("corpus").stdout() ); }); ripgrep-11.0.2/tests/tests.rs010064400017500000144000000011111351372666500143420ustar0000000000000000// Macros useful for testing. #[macro_use] mod macros; // Corpora. mod hay; // Utilities for making tests nicer to read and easier to write. mod util; // Tests for ripgrep's handling of binary files. mod binary; // Tests related to most features in ripgrep. If you're adding something new // to ripgrep, tests should probably go in here. mod feature; // Tests for ripgrep's JSON format. mod json; // Miscellaneous tests grouped in a haphazard manner. Try not to add more. mod misc; // Tests for ripgrep's multiline search support. mod multiline; // Regression tests. mod regression; ripgrep-11.0.2/tests/util.rs010064400017500000144000000336211352064771400141630ustar0000000000000000use std::env; use std::error; use std::ffi::OsStr; use std::fs::{self, File}; use std::io::{self, Write}; use std::path::{Path, PathBuf}; use std::process::{self, Command}; use std::sync::atomic::{AtomicUsize, Ordering}; use std::thread; use std::time::Duration; static TEST_DIR: &'static str = "ripgrep-tests"; static NEXT_ID: AtomicUsize = AtomicUsize::new(0); /// Setup an empty work directory and return a command pointing to the ripgrep /// executable whose CWD is set to the work directory. /// /// The name given will be used to create the directory. Generally, it should /// correspond to the test name. pub fn setup(test_name: &str) -> (Dir, TestCommand) { let dir = Dir::new(test_name); let cmd = dir.command(); (dir, cmd) } /// Like `setup`, but uses PCRE2 as the underlying regex engine. pub fn setup_pcre2(test_name: &str) -> (Dir, TestCommand) { let mut dir = Dir::new(test_name); dir.pcre2(true); let cmd = dir.command(); (dir, cmd) } /// Break the given string into lines, sort them and then join them back /// together. This is useful for testing output from ripgrep that may not /// always be in the same order. pub fn sort_lines(lines: &str) -> String { let mut lines: Vec<&str> = lines.trim().lines().collect(); lines.sort(); format!("{}\n", lines.join("\n")) } /// Returns true if and only if the given program can be successfully executed /// with a `--help` flag. pub fn cmd_exists(program: &str) -> bool { Command::new(program).arg("--help").output().is_ok() } /// Dir represents a directory in which tests should be run. /// /// Directories are created from a global atomic counter to avoid duplicates. #[derive(Clone, Debug)] pub struct Dir { /// The directory in which this test executable is running. root: PathBuf, /// The directory in which the test should run. If a test needs to create /// files, they should go in here. This directory is also used as the CWD /// for any processes created by the test. dir: PathBuf, /// Set to true when the test should use PCRE2 as the regex engine. pcre2: bool, } impl Dir { /// Create a new test working directory with the given name. The name /// does not need to be distinct for each invocation, but should correspond /// to a logical grouping of tests. pub fn new(name: &str) -> Dir { let id = NEXT_ID.fetch_add(1, Ordering::SeqCst); let root = env::current_exe() .unwrap() .parent() .expect("executable's directory") .to_path_buf(); let dir = env::temp_dir() .join(TEST_DIR) .join(name) .join(&format!("{}", id)); nice_err(&dir, repeat(|| fs::create_dir_all(&dir))); Dir { root: root, dir: dir, pcre2: false, } } /// Use PCRE2 for this test. pub fn pcre2(&mut self, yes: bool) { self.pcre2 = yes; } /// Returns true if and only if this test is configured to use PCRE2 as /// the regex engine. pub fn is_pcre2(&self) -> bool { self.pcre2 } /// Create a new file with the given name and contents in this directory, /// or panic on error. pub fn create>(&self, name: P, contents: &str) { self.create_bytes(name, contents.as_bytes()); } /// Try to create a new file with the given name and contents in this /// directory. #[allow(dead_code)] // unused on Windows pub fn try_create>( &self, name: P, contents: &str, ) -> io::Result<()> { let path = self.dir.join(name); self.try_create_bytes(path, contents.as_bytes()) } /// Create a new file with the given name and size. pub fn create_size>(&self, name: P, filesize: u64) { let path = self.dir.join(name); let file = nice_err(&path, File::create(&path)); nice_err(&path, file.set_len(filesize)); } /// Create a new file with the given name and contents in this directory, /// or panic on error. pub fn create_bytes>(&self, name: P, contents: &[u8]) { let path = self.dir.join(&name); nice_err(&path, self.try_create_bytes(name, contents)); } /// Try to create a new file with the given name and contents in this /// directory. pub fn try_create_bytes>( &self, name: P, contents: &[u8], ) -> io::Result<()> { let path = self.dir.join(name); let mut file = File::create(path)?; file.write_all(contents)?; file.flush() } /// Remove a file with the given name from this directory. pub fn remove>(&self, name: P) { let path = self.dir.join(name); nice_err(&path, fs::remove_file(&path)); } /// Create a new directory with the given path (and any directories above /// it) inside this directory. pub fn create_dir>(&self, path: P) { let path = self.dir.join(path); nice_err(&path, repeat(|| fs::create_dir_all(&path))); } /// Creates a new command that is set to use the ripgrep executable in /// this working directory. /// /// This also: /// /// * Unsets the `RIPGREP_CONFIG_PATH` environment variable. /// * Sets the `--path-separator` to `/` so that paths have the same output /// on all systems. Tests that need to check `--path-separator` itself /// can simply pass it again to override it. pub fn command(&self) -> TestCommand { let mut cmd = process::Command::new(&self.bin()); cmd.env_remove("RIPGREP_CONFIG_PATH"); cmd.current_dir(&self.dir); cmd.arg("--path-separator").arg("/"); if self.is_pcre2() { cmd.arg("--pcre2"); } TestCommand { dir: self.clone(), cmd: cmd } } /// Returns the path to the ripgrep executable. pub fn bin(&self) -> PathBuf { if cfg!(windows) { self.root.join("../rg.exe") } else { self.root.join("../rg") } } /// Returns the path to this directory. pub fn path(&self) -> &Path { &self.dir } /// Creates a directory symlink to the src with the given target name /// in this directory. #[cfg(not(windows))] pub fn link_dir, T: AsRef>(&self, src: S, target: T) { use std::os::unix::fs::symlink; let src = self.dir.join(src); let target = self.dir.join(target); let _ = fs::remove_file(&target); nice_err(&target, symlink(&src, &target)); } /// Creates a directory symlink to the src with the given target name /// in this directory. #[cfg(windows)] pub fn link_dir, T: AsRef>(&self, src: S, target: T) { use std::os::windows::fs::symlink_dir; let src = self.dir.join(src); let target = self.dir.join(target); let _ = fs::remove_dir(&target); nice_err(&target, symlink_dir(&src, &target)); } /// Creates a file symlink to the src with the given target name /// in this directory. #[cfg(not(windows))] pub fn link_file, T: AsRef>( &self, src: S, target: T, ) { self.link_dir(src, target); } /// Creates a file symlink to the src with the given target name /// in this directory. #[cfg(windows)] #[allow(dead_code)] // unused on Windows pub fn link_file, T: AsRef>( &self, src: S, target: T, ) { use std::os::windows::fs::symlink_file; let src = self.dir.join(src); let target = self.dir.join(target); let _ = fs::remove_file(&target); nice_err(&target, symlink_file(&src, &target)); } } /// A simple wrapper around a process::Command with some conveniences. #[derive(Debug)] pub struct TestCommand { /// The dir used to launched this command. dir: Dir, /// The actual command we use to control the process. cmd: Command, } impl TestCommand { /// Returns a mutable reference to the underlying command. pub fn cmd(&mut self) -> &mut Command { &mut self.cmd } /// Add an argument to pass to the command. pub fn arg>(&mut self, arg: A) -> &mut TestCommand { self.cmd.arg(arg); self } /// Add any number of arguments to the command. pub fn args( &mut self, args: I, ) -> &mut TestCommand where I: IntoIterator, A: AsRef { self.cmd.args(args); self } /// Set the working directory for this command. /// /// Note that this does not need to be called normally, since the creation /// of this TestCommand causes its working directory to be set to the /// test's directory automatically. pub fn current_dir>(&mut self, dir: P) -> &mut TestCommand { self.cmd.current_dir(dir); self } /// Runs and captures the stdout of the given command. pub fn stdout(&mut self) -> String { let o = self.output(); let stdout = String::from_utf8_lossy(&o.stdout); match stdout.parse() { Ok(t) => t, Err(err) => { panic!( "could not convert from string: {:?}\n\n{}", err, stdout ); } } } /// Pipe `input` to a command, and collect the output. pub fn pipe(&mut self, input: &[u8]) -> String { self.cmd.stdin(process::Stdio::piped()); self.cmd.stdout(process::Stdio::piped()); self.cmd.stderr(process::Stdio::piped()); let mut child = self.cmd.spawn().unwrap(); // Pipe input to child process using a separate thread to avoid // risk of deadlock between parent and child process. let mut stdin = child.stdin.take().expect("expected standard input"); let input = input.to_owned(); let worker = thread::spawn(move || { stdin.write_all(&input) }); let output = self.expect_success(child.wait_with_output().unwrap()); worker.join().unwrap().unwrap(); let stdout = String::from_utf8_lossy(&output.stdout); match stdout.parse() { Ok(t) => t, Err(err) => { panic!( "could not convert from string: {:?}\n\n{}", err, stdout ); } } } /// Gets the output of a command. If the command failed, then this panics. pub fn output(&mut self) -> process::Output { let output = self.cmd.output().unwrap(); self.expect_success(output) } /// Runs the command and asserts that it resulted in an error exit code. pub fn assert_err(&mut self) { let o = self.cmd.output().unwrap(); if o.status.success() { panic!( "\n\n===== {:?} =====\n\ command succeeded but expected failure!\ \n\ncwd: {}\ \n\nstatus: {}\ \n\nstdout: {}\n\nstderr: {}\ \n\n=====\n", self.cmd, self.dir.dir.display(), o.status, String::from_utf8_lossy(&o.stdout), String::from_utf8_lossy(&o.stderr) ); } } /// Runs the command and asserts that its exit code matches expected exit /// code. pub fn assert_exit_code(&mut self, expected_code: i32) { let code = self.cmd.output().unwrap().status.code().unwrap(); assert_eq!( expected_code, code, "\n\n===== {:?} =====\n\ expected exit code did not match\ \n\nexpected: {}\ \n\nfound: {}\ \n\n=====\n", self.cmd, expected_code, code ); } /// Runs the command and asserts that something was printed to stderr. pub fn assert_non_empty_stderr(&mut self) { let o = self.cmd.output().unwrap(); if o.status.success() || o.stderr.is_empty() { panic!( "\n\n===== {:?} =====\n\ command succeeded but expected failure!\ \n\ncwd: {}\ \n\nstatus: {}\ \n\nstdout: {}\n\nstderr: {}\ \n\n=====\n", self.cmd, self.dir.dir.display(), o.status, String::from_utf8_lossy(&o.stdout), String::from_utf8_lossy(&o.stderr) ); } } fn expect_success(&self, o: process::Output) -> process::Output { if !o.status.success() { let suggest = if o.stderr.is_empty() { "\n\nDid your search end up with no results?".to_string() } else { "".to_string() }; panic!("\n\n==========\n\ command failed but expected success!\ {}\ \n\ncommand: {:?}\ \ncwd: {}\ \n\nstatus: {}\ \n\nstdout: {}\ \n\nstderr: {}\ \n\n==========\n", suggest, self.cmd, self.dir.dir.display(), o.status, String::from_utf8_lossy(&o.stdout), String::from_utf8_lossy(&o.stderr)); } o } } fn nice_err( path: &Path, res: Result, ) -> T { match res { Ok(t) => t, Err(err) => panic!("{}: {:?}", path.display(), err), } } fn repeat io::Result<()>>(mut f: F) -> io::Result<()> { let mut last_err = None; for _ in 0..10 { if let Err(err) = f() { last_err = Some(err); thread::sleep(Duration::from_millis(500)); } else { return Ok(()); } } Err(last_err.unwrap()) } ripgrep-11.0.2/.cargo_vcs_info.json0000644000000001120000000000000126160ustar00{ "git": { "sha1": "3de31f752729525d85a3d1575ac1978733b3f7e7" } } ripgrep-11.0.2/Cargo.lock0000644000000662350000000000000106130ustar00# This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] name = "aho-corasick" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "atty" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "base64" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bitflags" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bstr" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bytecount" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "byteorder" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "clap" version = "2.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-channel" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-utils" version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "encoding_rs" version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "packed_simd 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "encoding_rs_io" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "fnv" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fs_extra" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "globset" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "grep" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "grep-cli 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "grep-matcher 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "grep-pcre2 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "grep-printer 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "grep-regex 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "grep-searcher 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "grep-cli" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "grep-matcher" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "grep-pcre2" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "grep-matcher 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "pcre2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "grep-printer" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "grep-matcher 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "grep-searcher 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "grep-regex" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "grep-matcher 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "grep-searcher" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "bytecount 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)", "encoding_rs_io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "grep-matcher 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ignore" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itoa" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "jemalloc-sys" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "fs_extra 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jemallocator" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "jemalloc-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "lazy_static" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" version = "0.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "log" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "memchr" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memmap" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num_cpus" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "packed_simd" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pcre2" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "pcre2-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pcre2-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pkg-config" version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quote" version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-automata" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ripgrep" version = "11.0.2" dependencies = [ "bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "grep 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "ignore 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "jemallocator 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ryu" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "same-file" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde" version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_json" version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "strsim" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" version = "0.15.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "termcolor" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "thread_local" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ucd-util" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unicode-width" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unicode-xid" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "utf8-ranges" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "walkdir" version = "2.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "winapi" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wincolor" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [metadata] "checksum aho-corasick 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "36b7aa1ccb7d7ea3f437cf025a2ab1c47cc6c1bc9fc84918ff449def12f5e282" "checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90" "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd" "checksum bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e0a692f1c740e7e821ca71a22cf99b9b2322dfa94d10f71443befb1797b3946a" "checksum bytecount 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be0fdd54b507df8f22012890aadd099979befdba27713c767993f8380112ca7c" "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" "checksum cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "ce400c638d48ee0e9ab75aef7997609ec57367ccfe1463f21bf53c3eca67bf46" "checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" "checksum crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" "checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" "checksum encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)" = "4155785c79f2f6701f185eb2e6b4caf0555ec03477cb4c70db67b465311620ed" "checksum encoding_rs_io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9619ee7a2bf4e777e020b95c1439abaf008f8ea8041b78a0552c4f1bcf4df32c" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum fs_extra 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5f2a4a2034423744d2cc7ca2068453168dcdb82c438419e639a26bd87839c674" "checksum globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2" "checksum grep 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cc3bb2d1f5b44bb1bf7f703430a139d1bbf2e51e5356f07864ff2fdf149570de" "checksum grep-cli 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1786e9d6ddf626943f405799539936a837a16c6731c97f3a97d1915aba004515" "checksum grep-matcher 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75c2fa3a90e22690d6921196acf1e0c1aa5840b2defc0b9549392f35ba537484" "checksum grep-pcre2 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "140b36973a0c9467b0f3c2fd820bb2c9f29a9934515aa4de550f08abf41b4cf2" "checksum grep-printer 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "15652b14c2fb81a2168ab3f19fd3a6ef35dee168a5d21a017009755dba0fac57" "checksum grep-regex 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "16a1f69564121087d83400818952b0bf257734f632dc571b40064b62970e1324" "checksum grep-searcher 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5e328a7e11030f3f3b93f2bc2ed4b7b87659307f619f8207bdd24c834f2d485e" "checksum ignore 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5d66819194c2b95fe5549e0dd76a9ab811740cb8b57e187e6c60ccf992faf19b" "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" "checksum jemalloc-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0d3b9f3f5c9b31aa0f5ed3260385ac205db665baa41d49bb8338008ae94ede45" "checksum jemallocator 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "43ae63fcfc45e99ab3d1b29a46782ad679e98436c3169d15a167a1108a724b69" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)" = "d44e80633f007889c7eff624b709ab43c92d708caad982295768a7b13ca3b5eb" "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" "checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" "checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273" "checksum packed_simd 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a85ea9fc0d4ac0deb6fe7911d38786b32fc11119afd9e9d38b84ff691ce64220" "checksum pcre2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "603da5e101220b9b306bf28e4f1f8703458ce2f64d2787b374e1a19494317180" "checksum pcre2-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "876c72d05059d23a84bd9fcdc3b1d31c50ea7fe00fe1522b4e68cd3608db8d5b" "checksum pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c1d2cfa5a714db3b5f24f0915e74fcdf91d09d496ba61329705dda7774d2af" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" "checksum regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6b23da8dfd98a84bd7e08700190a5d9f7d2d38abd4369dd1dae651bc40bfd2cc" "checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" "checksum regex-syntax 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5485bf1523a9ed51c4964273f22f63f24e31632adb5dad134f488f86a3875c" "checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997" "checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421" "checksum serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)" = "7fe5626ac617da2f2d9c48af5515a21d5a480dbd151e01bb1c355e26a3e68113" "checksum serde_derive 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)" = "01e69e1b8a631f245467ee275b8c757b818653c6d704cdbcaeb56b56767b529c" "checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704" "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" "checksum syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)" = "eadc09306ca51a40555dd6fc2b415538e9e18bc9f870e47b1a524a79fe2dcf5e" "checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum ucd-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa9b3b49edd3468c0e6565d85783f51af95212b6fa3986a5500954f00b460874" "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9d50aa7650df78abf942826607c62468ce18d9019673d4a2ebe1865dbb96ffde" "checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e" "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba"