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:
parent
661baf6c16
commit
b7e6a77ef5
1 changed files with 21 additions and 16 deletions
35
systab
35
systab
|
|
@ -388,7 +388,7 @@ 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
|
||||||
#
|
#
|
||||||
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue