Accept spaces or tabs as field separators in edit mode

Parse crontab lines by splitting on the first two whitespace
boundaries via regex, so both spaces and tabs work as delimiters.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Matthias Johnson 2026-02-14 00:02:20 -07:00
parent 661baf6c16
commit b7e6a77ef5

37
systab
View file

@ -388,9 +388,9 @@ edit_jobs() {
{ {
cat <<'HEADER' cat <<'HEADER'
# systab jobs — edit schedule/command, add/remove lines # systab jobs — edit schedule/command, add/remove lines
# Format: ID SCHEDULE COMMAND # Format: ID SCHEDULE COMMAND (whitespace-separated)
# Lines starting with # are ignored. Remove a line to delete a job. # Lines starting with # are ignored. Remove a line to delete a job.
# Add a line with "new" as ID to create a job: new daily /path/to/cmd # Add a line with "new" as ID to create a job: new daily /path/to/cmd
# #
# Schedule formats (systemd OnCalendar): # Schedule formats (systemd OnCalendar):
# hourly, daily, weekly, monthly, yearly # hourly, daily, weekly, monthly, yearly
@ -449,29 +449,34 @@ HEADER
fi fi
done < <(get_managed_timers) done < <(get_managed_timers)
# Parse a crontab line into id, sched, cmd (split on first two whitespace runs)
parse_crontab_line() {
local line="$1"
_parsed_id="" _parsed_sched="" _parsed_cmd=""
if [[ "$line" =~ ^([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+(.*) ]]; then
_parsed_id="${BASH_REMATCH[1]}"
_parsed_sched="${BASH_REMATCH[2]}"
_parsed_cmd="${BASH_REMATCH[3]}"
fi
}
# Parse original file # Parse original file
while IFS= read -r line; do while IFS= read -r line; do
[[ "$line" =~ ^#.*$ || -z "$line" ]] && continue [[ "$line" =~ ^#.*$ || -z "$line" ]] && continue
local id sched cmd parse_crontab_line "$line"
id=$(printf '%s' "$line" | cut -f1) [[ -n "$_parsed_id" && -n "$_parsed_sched" ]] || continue
sched=$(printf '%s' "$line" | cut -f2) orig_jobs["$_parsed_id"]="${_parsed_sched} ${_parsed_cmd}"
cmd=$(printf '%s' "$line" | cut -f3-)
[[ -n "$id" && -n "$sched" ]] || continue
orig_jobs["$id"]="${sched} ${cmd}"
done < "$orig_file" done < "$orig_file"
# Parse edited file # Parse edited file
while IFS= read -r line; do while IFS= read -r line; do
[[ "$line" =~ ^#.*$ || -z "$line" ]] && continue [[ "$line" =~ ^#.*$ || -z "$line" ]] && continue
local id sched cmd parse_crontab_line "$line"
id=$(printf '%s' "$line" | cut -f1) [[ -n "$_parsed_id" && -n "$_parsed_sched" ]] || continue
sched=$(printf '%s' "$line" | cut -f2) if [[ "$_parsed_id" == "new" ]]; then
cmd=$(printf '%s' "$line" | cut -f3-) new_jobs+=("${_parsed_sched} ${_parsed_cmd}")
[[ -n "$id" && -n "$sched" ]] || continue
if [[ "$id" == "new" ]]; then
new_jobs+=("${sched} ${cmd}")
else else
edited_jobs["$id"]="${sched} ${cmd}" edited_jobs["$_parsed_id"]="${_parsed_sched} ${_parsed_cmd}"
fi fi
done < "$temp_file" done < "$temp_file"