aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/sed
diff options
context:
space:
mode:
authorMateusz Piotrowski <0mp@FreeBSD.org>2020-06-10 19:23:58 +0000
committerMateusz Piotrowski <0mp@FreeBSD.org>2020-06-10 19:23:58 +0000
commitf9ab72bb471a141f31a4476bb11bdaef81daf479 (patch)
tree90769b74cb50b72225880137c4c8a5eb6694c00e /usr.bin/sed
parentee424b7351238024f8eb704aa2775b0b37876fb1 (diff)
downloadsrc-f9ab72bb471a141f31a4476bb11bdaef81daf479.tar.gz
src-f9ab72bb471a141f31a4476bb11bdaef81daf479.zip
Notes
Diffstat (limited to 'usr.bin/sed')
-rw-r--r--usr.bin/sed/main.c18
-rw-r--r--usr.bin/sed/sed.110
-rwxr-xr-xusr.bin/sed/tests/sed2_test.sh57
3 files changed, 79 insertions, 6 deletions
diff --git a/usr.bin/sed/main.c b/usr.bin/sed/main.c
index 96994ec4469d..44a274eb90e6 100644
--- a/usr.bin/sed/main.c
+++ b/usr.bin/sed/main.c
@@ -126,12 +126,13 @@ static void usage(void);
int
main(int argc, char *argv[])
{
- int c, fflag;
+ int c, fflag, fflagstdin;
char *temp_arg;
(void) setlocale(LC_ALL, "");
fflag = 0;
+ fflagstdin = 0;
inplace = NULL;
while ((c = getopt(argc, argv, "EI:ae:f:i:lnru")) != -1)
@@ -157,6 +158,8 @@ main(int argc, char *argv[])
break;
case 'f':
fflag = 1;
+ if (strcmp(optarg, "-") == 0)
+ fflagstdin = 1;
add_compunit(CU_FILE, optarg);
break;
case 'i':
@@ -193,6 +196,8 @@ main(int argc, char *argv[])
if (*argv)
for (; *argv; argv++)
add_file(*argv);
+ else if (fflagstdin)
+ exit(rval);
else
add_file(NULL);
process();
@@ -236,9 +241,14 @@ again:
linenum = 0;
switch (script->type) {
case CU_FILE:
- if ((f = fopen(script->s, "r")) == NULL)
- err(1, "%s", script->s);
- fname = script->s;
+ if (strcmp(script->s, "-") == 0) {
+ f = stdin;
+ fname = "stdin";
+ } else {
+ if ((f = fopen(script->s, "r")) == NULL)
+ err(1, "%s", script->s);
+ fname = script->s;
+ }
state = ST_FILE;
goto again;
case CU_STRING:
diff --git a/usr.bin/sed/sed.1 b/usr.bin/sed/sed.1
index d395b2614070..10a625825c6a 100644
--- a/usr.bin/sed/sed.1
+++ b/usr.bin/sed/sed.1
@@ -31,7 +31,7 @@
.\" @(#)sed.1 8.2 (Berkeley) 12/30/93
.\" $FreeBSD$
.\"
-.Dd May 19, 2020
+.Dd June 10, 2020
.Dt SED 1
.Os
.Sh NAME
@@ -98,6 +98,10 @@ Append the editing commands found in the file
.Ar command_file
to the list of commands.
The editing commands should each be listed on a separate line.
+The commands are read from the standard input if
+.Ar command_file
+is
+.Dq Li - .
.It Fl I Ar extension
Edit files in-place, saving backups with the specified
.Ar extension .
@@ -636,7 +640,9 @@ The
.Fl E , I , a
and
.Fl i
-options, the prefixing
+options, the special meaning of
+.Fl f Cm - ,
+the prefixing
.Dq \&+
in the second member of an address range,
as well as the
diff --git a/usr.bin/sed/tests/sed2_test.sh b/usr.bin/sed/tests/sed2_test.sh
index c7f4b29a8f88..48be7b76fa18 100755
--- a/usr.bin/sed/tests/sed2_test.sh
+++ b/usr.bin/sed/tests/sed2_test.sh
@@ -116,11 +116,68 @@ hex_subst_body()
atf_check -o "inline:" sed 's/\xx//' d
}
+atf_test_case commands_on_stdin
+commands_on_stdin_head()
+{
+ atf_set "descr" "Verify -f -"
+}
+commands_on_stdin_body()
+{
+ printf "a\n" > a
+ printf "s/a/b/\n" > a_to_b
+ printf "s/b/c/\n" > b_to_c
+ printf "s/c/d/\n" > ./-
+ atf_check -o 'inline:d\n' sed -f a_to_b -f - -f ./- a < b_to_c
+
+ # Verify that nothing is printed if there are no input files provided.
+ printf 'i\\\nx' > insert_x
+ atf_check -o 'empty' sed -f - < insert_x
+}
+
+atf_test_case commands_on_stdin
+commands_on_stdin_head()
+{
+ atf_set "descr" "Verify -f -"
+}
+commands_on_stdin_body()
+{
+ printf "a\n" > a
+ printf "s/a/b/\n" > a_to_b
+ printf "s/b/c/\n" > b_to_c
+ printf "s/c/d/\n" > ./-
+ atf_check -o 'inline:d\n' sed -f a_to_b -f - -f ./- a < b_to_c
+
+ # Verify that nothing is printed if there are no input files provided.
+ printf 'i\\\nx' > insert_x
+ atf_check -o 'empty' sed -f - < insert_x
+}
+
+atf_test_case commands_on_stdin
+commands_on_stdin_head()
+{
+ atf_set "descr" "Verify -f -"
+}
+commands_on_stdin_body()
+{
+ printf "a\n" > a
+ printf "s/a/b/\n" > a_to_b
+ printf "s/b/c/\n" > b_to_c
+ printf "s/c/d/\n" > ./-
+ atf_check -o 'inline:d\n' sed -f a_to_b -f - -f ./- a < b_to_c
+
+ # Verify that nothing is printed if there are no input files provided.
+ printf 'i\\\nx' > insert_x
+ atf_check -o 'empty' sed -f - < insert_x
+}
+
atf_init_test_cases()
{
atf_add_test_case inplace_command_q
atf_add_test_case inplace_hardlink_src
atf_add_test_case inplace_symlink_src
atf_add_test_case escape_subst
+ atf_add_test_case commands_on_stdin
+ atf_add_test_case commands_on_stdin
+ atf_add_test_case commands_on_stdin
atf_add_test_case hex_subst
}