aboutsummaryrefslogtreecommitdiff
path: root/string_manipulation.html
blob: ca7b3edb399833127e0bcd73f795c878615a4907 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# Bash string manipulation cheatsheet
# https://gist.github.com/magnetikonline/90d6fe30fc247ef110a1

<table>
	<tr>
		<th align="left" colspan="2">Assignment</th>
	</tr>
	<tr>
		<td>Assign <code>value</code> to <code>variable</code> if <code>variable</code> is not already set, <code>value</code> is returned.<br /><br />Combine with a <code>:</code> no-op to discard/ignore return <code>value</code>.</td>
		<td><code>${variable="value"}</code><br /><code>: ${variable="value"}</code></td>
	</tr>
	<tr>
		<th align="left" colspan="2">Removal</th>
	</tr>
	<tr>
		<td>Delete shortest match of <code>needle</code> from front of <code>haystack</code>.</td>
		<td><code>${haystack#needle}</code></td>
	</tr>
	<tr>
		<td>Delete longest match of <code>needle</code> from front of <code>haystack</code>.</td>
		<td><code>${haystack##needle}</code></td>
	</tr>
	<tr>
		<td>Delete shortest match of <code>needle</code> from back of <code>haystack</code>.</td>
		<td><code>${haystack%needle}</code></td>
	</tr>
	<tr>
		<td>Delete longest match of <code>needle</code> from back of <code>haystack</code>.</td>
		<td><code>${haystack%%needle}</code></td>
	</tr>
	<tr>
		<th align="left" colspan="2">Replacement</th>
	</tr>
	<tr>
		<td>Replace first match of <code>needle</code> with <code>replacement</code> from <code>haystack</code>.</td>
		<td><code>${haystack/needle/replacement}</code></td>
	</tr>
	<tr>
		<td>Replace all matches of <code>needle</code> with <code>replacement</code> from <code>haystack</code>.</td>
		<td><code>${haystack//needle/replacement}</code></td>
	</tr>
	<tr>
		<td>If <code>needle</code> matches front of <code>haystack</code> replace with <code>replacement</code>.</td>
		<td><code>${haystack/#needle/replacement}</code></td>
	</tr>
	<tr>
		<td>If <code>needle</code> matches back of <code>haystack</code> replace with <code>replacement</code>.</td>
		<td><code>${haystack/%needle/replacement}</code></td>
	</tr>
	<tr>
		<th align="left" colspan="2">Substitution</th>
	</tr>
	<tr>
		<td>If <code>variable</code> not set, return <code>value</code>, else <code>variable</code>.</td>
		<td><code>${variable-value}</code></td>
	</tr>
	<tr>
		<td>If <code>variable</code> not set <em>or</em> empty, return <code>value</code>, else <code>variable</code>.</td>
		<td><code>${variable:-value}</code></td>
	</tr>
	<tr>
		<td>If <code>variable</code> set, return <code>value</code>, else null string.</td>
		<td><code>${variable+value}</code></td>
	</tr>
	<tr>
		<td>If <code>variable</code> set <em>and</em> not empty, return <code>value</code>, else null string.</td>
		<td><code>${variable:+value}</code></td>
	</tr>
	<tr>
		<th align="left" colspan="2">Extraction</th>
	</tr>
	<tr>
		<td>Extract <code>length</code> characters from <code>variable</code> starting at <code>position</code>.</td>
		<td><code>${variable:position:length}</code></td>
	</tr>
	<tr>
		<td>Return string length of <code>variable</code>.</td>
		<td><code>${#variable}</code></td>
	</tr>
	<tr>
		<th align="left" colspan="2">Escaping</th>
	</tr>
	<tr>
		<td>Single quotes inside a single quoted string.</td>
		<td><code>echo 'Don'\''t break my escape!'</code></td>
	</tr>
	<tr>
		<th align="left" colspan="2">Indirection</th>
	</tr>
	<tr>
		<td>Return value of variable name held in <code>indirect</code>, else <code>value</code>.</td>
		<td><code>indirect="apple"</code><br /><code>apple="fruit"</code><br /><code>${!indirect-value}</code></td>
	</tr>
</table>

## Reference

- https://tldp.org/LDP/abs/html/string-manipulation.html
- https://tldp.org/LDP/abs/html/parameter-substitution.html
- https://tldp.org/LDP/abs/html/ivr.html
- Special characters:
	- `*`: https://www.tldp.org/LDP/abs/html/special-chars.html#ASTERISKREF
	- `?`: https://www.tldp.org/LDP/abs/html/special-chars.html#WILDCARDQU
- https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02