menu

Top 1 deals for Aba Software Software

40
Followers

Get all the best deals that Aba Software has to offer right here on BitsDuJour. Click quick, these discounts don't last long, and we update daily! We have deals on Aba Search and Replace, .

If you Follow Aba Software, you'll get emails when deals go live!

Visit the Aba Software website.

Aba Search and Replace Screenshot
Aba Search and Replace (PC) Discount
for PC

Aba Search and Replace

Easily Perform Global Search and Replace Operations

30% Off
 

Vendor Pulse

The latest news, straight from our vendors.

  • Sunday at 4:38am
    Mnemonics for hidden controls

    As you may know, you can switch between Windows controls using mnemonics. If you see an underlined character in any Windows application, you can press Alt + this character to set focus to this control or to click a button. For example, in this window, you can press:

    • Alt+D to go to the Decoded JSON Web Token field,
    • Alt+C to click the Copy button, or
    • Alt+F to uncheck the Format JSON option.
    Aba Search and Replace window

    The underlines become visible when you press the Alt key.

    However, if a control is hidden in Win32 (using the ShowWindow function), the mnemonic for it still works. You can still press a hidden button if you know its mnemonic. Imagine you hide a button for unauthorized users, but these users can press it using the Alt+character keyboard shortcut, so this behavior can even create a security vulnerability.

    If your application shows some controls and hides others depending on the state, you may have two controls with the same mnemonic. If one of them is hidden, it may be activated instead of the visible control with the same mnemonic. This happened to me when testing the previous version of Aba Search and Replace.

    The fix is easy: you need to disable a control when you hide it and enable it when you show it. Each ShowWindow call should be paired with an EnableWindow call; you could create a small function that will call both and use it everywhere instead of ShowWindow.

    This quirk applies only to the classic Win32 applications. I've tested with Windows Forms, WPF, and WinUI 3, and you cannot press a hidden button using its mnemonic there. Win32 provides an extra flexibility: you can create a mnemonic that does not correspond to any visible control, but this flexibility is usually not needed and can cause confusion.

  • Sep 7 at 6:25am
    Unix and JavaScript timestamps

    Unix time is the number of seconds elapsed since midnight UTC on January 1, 1970. For example, Unix time was 17‍56684800 on September 1, 2025 at midnight UTC. The counter is independent of the time zone, holding the same value at the same moment in different timezones. It is widely used in C and C++ programming languages, databases (MySQL, PostgreSQL, and SQLite), and file systems (ext3, HFS+, and Reiserfs).

    The counter is typically stored in a 32-bit signed integer, so it can represent dates from December 13, 1901 to January 19, 2038. In 2038, the counter will reach 231−1 and overflow, which is known as the year 2038 problem. Fortunately, most modern implementations have already switched to 64-bit integers.

    Java and JavaScript use the number of milliseconds, not seconds, to represent time since 1970, resulting in a counter with more digits (e.g., 17‍56684800000) that fits in a 64-bit integer. Some other implementations (e.g., Apple File System) count the number of nanoseconds instead.

    The Unix developers chose the epoch of January 1, 1970 because they created the first version of Unix in 1970, so they only needed to represent dates after 1970. Other platforms chose a date close to the introduction of the Gregorian calendar, for example, the Windows counter (the FILETIME structure) starts on January 1, 1601 and the UUID version 1 counter starts on October 15, 1582.

    You can use the following functions in different programming languages to get the current Unix timestamp value:

    • in C/C++, use time_t timestamp = time(NULL);
    • in PHP, use echo time();
    • in Python, use:
    • import time, math
      print(math.ceil(time.time()))
          
    • in JavaScript, use Math.ceil(Date.now() / 1000);
    • in Java, use long timestamp = System.currentTimeMillis() / 1000;
    • in Go, use:
    • import "time"
      timestamp := time.Now().Unix();
      
    • in MySQL, use select unix_timestamp();
    • in PostgreSQL, use select ceil(extract(epoch from current_timestamp));
    • in SQLite, use select strftime('%s');
    Decode Unix timestamp

    Aba Search and Replace can convert Unix/JavaScript timestamps to a date in popular formats including ISO 8601 / RFC 3339, RFC 1123 / RFC 7231, and the Windows system format. It can also perform the reverse conversion and generate the current timestamp.

  • May 10 at 6:29am
    Replace only the Nth match

    Here is another practical task. We need to replace only the second or following match in each file.

    For example, we want to insert <a name="..."> tags before the second and any subsequent headers in each HTML file. There are multiple headers in each file:

    Matching <h2> headers

    And we want to insert a name to be able to refer to each header. The final result should look like this (the added tag is bold):

    <a name="international_search_test"><h2>International search test</h2>
    

    We can solve this task with a lookbehind:

    Matching the second, the third, etc. tags
    (?<=<h2>.*?)<h2>
    

    This regular expression matches <h2>, but only if there is another <h2> before it.

    With Aba Search and Replace, there is a more flexible way to do this. You can match all <h2> tags, but change only the second, the third, etc. tags leaving the first tag intact. The pattern is simple:

    <h2>(.*?)</h2>
    

    But in the replacement, we check if the match number is equal to one:

    \( if Aba.matchNoInFile() == 1 {
       \0
    } else {
       '<a name="' \1.replace(' ', '_').toLower() '">' \0
    } )
    

    If yes, we return the whole match \0 without any change. If not, we add <a name="..."> before it. We also use the toLower function to convert the name to lowercase and the replace function to replace spaces with underscores.

    Replacing the second, the third, etc. tags

    You can easily modify this one-liner to replace the first three tags in each file only, or replace every second tag, which is more complicated with a lookbehind.

  • Mar 8 at 5:00pm
    Aba 2.8 released

    The new version goes beyond just search and replace; it allows you to convert text and images to and from Base64, encode and decode HTML entities like &lt;, encode and decode percent-encoding (also known as URL encoding), decode JSON Web Tokens, and convert Unix/JavaScript timestamps to dates and vice versa.

    Decode image from Base64 Decode Unix timestamp

    Other new features and fixes include:

    • Fixed: a long file name was cut in the combobox (many thanks to Duane who reported the bug).
    • An option to disable the dot matches newline mode (the \s modifier; thanks to Helmet for the idea).
    • Line numbers in the text viewer (thanks to Yonatan).
    • An option to preserve the files' date/time (thanks to Duane).
    • Syntax highlighting for Scala and Go.
    • Ctrl+1, Ctrl+2, etc. to switch between the tabs.
    • Updated translations.
    • Fixed: when reading from disk failed, Aba crashed (mostly applicable to old HDDs and network drives).
    • Fixed: incorrect cursor position for Chinese characters.
    • Fixed: excessive completion sound when the search pattern was changed.
    • Fixed: in the Undo > In files field, the vertical scrollbar was displayed for long directory names.
    • Fixed: in some cases, a previous file name remained in the status bar when the search did not find anything.

    Just as always, the upgrade is free for the registered users.

  • Jan 11 at 2:06am
    Anonymizing a dataset by replacing names with counters

    Sometimes, you need to remove personal data from a dataset, such as when preparing examples or unit tests. With Aba Search and Replace, you can mask names, addresses, and other personally identifiable information by replacing them with counters.

    Let's use the following CSV file with information about Alice in Wonderland characters as an example:

    Name,Address,Favorite Color
    Alice,Near the Rabbit Hole,Blue
    Mad Hatter,Tea Party Garden,Orange
    White Rabbit,Rabbit Hole,White
    Queen of Hearts,Hearts Castle,Red
    Cheshire Cat,Forest Tree Hollow,Purple
    Caterpillar,Mushroom Grove,Green
    Tweedledee,Looking Glass Land,Yellow
    Tweedledum,Looking Glass Land,Yellow
    March Hare,Mad Tea Party Estate,Brown
    Dormouse,Tea Party Garden,Gray
    

    You want to remove real names and addresses from this file. A common approach would be to write a script that opens the file, reads each line, replaces the first two fields with counters, and then prints the result. However, it's easier to do the same task with Aba Search and Replace. You don't have to write boilerplate code for file reading, and you can immediately preview the replacement results.

    We'll use the following regular expression to match the first two columns in the CSV file while skipping the headers:

    (?<=\n)(\N+?),(\N+?),
    

    Here's how it works: first, we check that a newline \n is found before the match using a lookbehind assertion, which allows us to skip the headers (the first line). Next, we match two fields separated with commas.

    We would like to replace the names (Alice, Mad Hatter, White Rabbit, etc.) with a counter like person1, person2, person3, etc. Aba provides functions for inserting counters; Aba.matchNo works well for this case:

    Aba window

    For the address field, we don't want to use the same sequence (1, 2, 3), so let's do some math with the counter in order to start from 77 and decrement each street number by 3. The replacement expression becomes:

    person\{ Aba.matchNo() },\{ 80 - Aba.matchNo() * 3 } Wonderland Drive,
    

    Note that proper anonymization is more complex than this. In our example, it's still possible to identify some characters after the replacement. For example, White Rabbit predictably likes white, Queen of Hearts likes red ❤️, and the twins (Tweedledee and Tweedledum) share the same favorite color, yellow. So the anonymization process won't meet GDPR requirements and you need further manual edits to remove or randomize such cases, but the replacement is a good first step for removing sensitive information.

BitsDuJour is for People who Love Software
Every day we review great Mac & PC apps, and get you discounts up to 100%
Follow Us
© Copyright 2025 BitsDuJour LLC. Code & Design. All Rights Reserved. Privacy Policy