diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-08-01 04:14:46 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-08-01 04:14:46 +0200 |
commit | 2e284a40bcb9d5c73b86603fe31f3a175023d88a (patch) | |
tree | 136dd1fc079bebe47954e8fab8d99e5376d7d9af | |
parent | 138ce54c9c1930348bc842be781accd7c50c2cef (diff) | |
download | busybox-w32-2e284a40bcb9d5c73b86603fe31f3a175023d88a.tar.gz busybox-w32-2e284a40bcb9d5c73b86603fe31f3a175023d88a.tar.bz2 busybox-w32-2e284a40bcb9d5c73b86603fe31f3a175023d88a.zip |
sed: fix sed -i: unlike without -i, it does not forget ranges
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | editors/sed.c | 13 | ||||
-rwxr-xr-x | testsuite/sed.tests | 7 |
2 files changed, 15 insertions, 5 deletions
diff --git a/editors/sed.c b/editors/sed.c index 7af8f867a..7d6e7e79f 100644 --- a/editors/sed.c +++ b/editors/sed.c | |||
@@ -61,6 +61,10 @@ | |||
61 | #include "libbb.h" | 61 | #include "libbb.h" |
62 | #include "xregex.h" | 62 | #include "xregex.h" |
63 | 63 | ||
64 | enum { | ||
65 | OPT_in_place = 1 << 0, | ||
66 | }; | ||
67 | |||
64 | /* Each sed command turns into one of these structures. */ | 68 | /* Each sed command turns into one of these structures. */ |
65 | typedef struct sed_cmd_s { | 69 | typedef struct sed_cmd_s { |
66 | /* Ordered by alignment requirements: currently 36 bytes on x86 */ | 70 | /* Ordered by alignment requirements: currently 36 bytes on x86 */ |
@@ -938,8 +942,11 @@ static void process_files(void) | |||
938 | 942 | ||
939 | if (matched) { | 943 | if (matched) { |
940 | /* once matched, "n,xxx" range is dead, disabling it */ | 944 | /* once matched, "n,xxx" range is dead, disabling it */ |
941 | if (sed_cmd->beg_line > 0) | 945 | if (sed_cmd->beg_line > 0 |
946 | && !(option_mask32 & OPT_in_place) /* but not for -i */ | ||
947 | ) { | ||
942 | sed_cmd->beg_line = -2; | 948 | sed_cmd->beg_line = -2; |
949 | } | ||
943 | sed_cmd->in_match = !( | 950 | sed_cmd->in_match = !( |
944 | /* has the ending line come, or is this a single address command? */ | 951 | /* has the ending line come, or is this a single address command? */ |
945 | (sed_cmd->end_line ? | 952 | (sed_cmd->end_line ? |
@@ -1270,9 +1277,6 @@ static void add_cmd_block(char *cmdstr) | |||
1270 | int sed_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 1277 | int sed_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
1271 | int sed_main(int argc UNUSED_PARAM, char **argv) | 1278 | int sed_main(int argc UNUSED_PARAM, char **argv) |
1272 | { | 1279 | { |
1273 | enum { | ||
1274 | OPT_in_place = 1 << 0, | ||
1275 | }; | ||
1276 | unsigned opt; | 1280 | unsigned opt; |
1277 | llist_t *opt_e, *opt_f; | 1281 | llist_t *opt_e, *opt_f; |
1278 | int status = EXIT_SUCCESS; | 1282 | int status = EXIT_SUCCESS; |
@@ -1292,6 +1296,7 @@ int sed_main(int argc UNUSED_PARAM, char **argv) | |||
1292 | opt_e = opt_f = NULL; | 1296 | opt_e = opt_f = NULL; |
1293 | opt_complementary = "e::f::" /* can occur multiple times */ | 1297 | opt_complementary = "e::f::" /* can occur multiple times */ |
1294 | "nn"; /* count -n */ | 1298 | "nn"; /* count -n */ |
1299 | /* -i must be first, to match OPT_in_place definition */ | ||
1295 | opt = getopt32(argv, "irne:f:", &opt_e, &opt_f, | 1300 | opt = getopt32(argv, "irne:f:", &opt_e, &opt_f, |
1296 | &G.be_quiet); /* counter for -n */ | 1301 | &G.be_quiet); /* counter for -n */ |
1297 | //argc -= optind; | 1302 | //argc -= optind; |
diff --git a/testsuite/sed.tests b/testsuite/sed.tests index 3301a25f8..445eff6bc 100755 --- a/testsuite/sed.tests +++ b/testsuite/sed.tests | |||
@@ -270,11 +270,16 @@ testing "sed a cmd ended by double backslash" \ | |||
270 | | two \\ | 270 | | two \\ |
271 | ' | 271 | ' |
272 | 272 | ||
273 | # fisrt three lines are deleted; 4th line is matched and printed by "2,3" and by "4" ranges | 273 | # first three lines are deleted; 4th line is matched and printed by "2,3" and by "4" ranges |
274 | testing "sed with N skipping lines past ranges on next cmds" \ | 274 | testing "sed with N skipping lines past ranges on next cmds" \ |
275 | "sed -n '1{N;N;d};1p;2,3p;3p;4p'" \ | 275 | "sed -n '1{N;N;d};1p;2,3p;3p;4p'" \ |
276 | "4\n4\n" "" "1\n2\n3\n4\n" | 276 | "4\n4\n" "" "1\n2\n3\n4\n" |
277 | 277 | ||
278 | testing "sed -i with address modifies all files, not only first" \ | ||
279 | "cp input input2; sed -i -e '1s/foo/bar/' input input2 && cat input input2; rm input2" \ | ||
280 | "bar\nbar\n" "foo\n" "foo\n" | ||
281 | |||
282 | |||
278 | # testing "description" "arguments" "result" "infile" "stdin" | 283 | # testing "description" "arguments" "result" "infile" "stdin" |
279 | 284 | ||
280 | exit $FAILCOUNT | 285 | exit $FAILCOUNT |