updated docs more
This commit is contained in:
parent
6e94d324ef
commit
686f63f665
@ -11,7 +11,8 @@ EXTRA_DIST = \
|
|||||||
page/io.doc \
|
page/io.doc \
|
||||||
page/awk-embed.md \
|
page/awk-embed.md \
|
||||||
page/awk-lang.md \
|
page/awk-lang.md \
|
||||||
page/sed.doc \
|
page/sed-cmd.md \
|
||||||
|
page/sed-embed.md \
|
||||||
image/qse-logo.png
|
image/qse-logo.png
|
||||||
|
|
||||||
all:
|
all:
|
||||||
|
@ -236,7 +236,8 @@ EXTRA_DIST = \
|
|||||||
page/io.doc \
|
page/io.doc \
|
||||||
page/awk-embed.md \
|
page/awk-embed.md \
|
||||||
page/awk-lang.md \
|
page/awk-lang.md \
|
||||||
page/sed.doc \
|
page/sed-cmd.md \
|
||||||
|
page/sed-embed.md \
|
||||||
image/qse-logo.png
|
image/qse-logo.png
|
||||||
|
|
||||||
all: all-am
|
all: all-am
|
||||||
|
@ -111,6 +111,10 @@ Creating multiple awk objects
|
|||||||
Memory Pool
|
Memory Pool
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
Locale
|
||||||
|
------
|
||||||
|
|
||||||
|
|
||||||
Embedding in C++
|
Embedding in C++
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
@ -122,6 +126,31 @@ less numbers of lines in C++.
|
|||||||
|
|
||||||
\includelineno awk21.cpp
|
\includelineno awk21.cpp
|
||||||
|
|
||||||
|
Customizing the console I/O is not much different in C++. When using the
|
||||||
|
QSE::StdAwk class, you can inherit the class and implement these five methods:
|
||||||
|
|
||||||
|
- int openConsole (Console& io);
|
||||||
|
- int closeConsole (Console& io);
|
||||||
|
- int flushConsole (Console& io);
|
||||||
|
- int nextConsole (Console& io);
|
||||||
|
- ssize_t readConsole (Console& io, char_t* data, size_t size);
|
||||||
|
- ssize_t writeConsole (Console& io, const char_t* data, size_t size);
|
||||||
|
|
||||||
|
The sample below shows how to do it to use a string as the console input
|
||||||
|
and store the console output to a string buffer.
|
||||||
|
|
||||||
|
\includelineno awk22.cpp
|
||||||
|
|
||||||
|
Alternatively, you can choose to implement QSE::Awk::Console::Handler
|
||||||
|
and call QSE::Awk::setConsoleHandler() with the implemented handler.
|
||||||
|
This way, you do not need to inherit QSE::Awk or QSE::StdAwk.
|
||||||
|
The sample here shows how to customize the console I/O by implementing
|
||||||
|
QSE::Awk::Console::Handler. It also shows how to run the same script
|
||||||
|
over two different data streams in a row.
|
||||||
|
|
||||||
|
\includelineno awk23.cpp
|
||||||
|
|
||||||
|
|
||||||
Changes in 0.6.0
|
Changes in 0.6.0
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
@ -23,8 +23,9 @@ See the subpages for more information.
|
|||||||
- @ref installation
|
- @ref installation
|
||||||
- @ref awk-lang
|
- @ref awk-lang
|
||||||
- @ref awk-embed
|
- @ref awk-embed
|
||||||
|
- @ref sed-cmd
|
||||||
|
- @ref sed-embed
|
||||||
- @subpage mem "Memory Management"
|
- @subpage mem "Memory Management"
|
||||||
- @subpage cenc "Character Encoding"
|
- @subpage cenc "Character Encoding"
|
||||||
- @subpage io "I/O Handling"
|
- @subpage io "I/O Handling"
|
||||||
- @subpage sed "SED Stream Editor"
|
|
||||||
|
|
||||||
|
@ -1,114 +1,48 @@
|
|||||||
/** @page sed Stream Editor
|
QSESED Commands {#sed-cmd}
|
||||||
|
================================================================================
|
||||||
@section sed_contents CONTENTS
|
|
||||||
- \ref sed_intro
|
|
||||||
- \ref sed_command
|
|
||||||
|
|
||||||
@section sed_intro INTRODUCTION
|
|
||||||
|
|
||||||
|
Overview
|
||||||
|
--------
|
||||||
A stream editor is a non-interactive text editing tool commonly used
|
A stream editor is a non-interactive text editing tool commonly used
|
||||||
on Unix environment. It reads text from an input stream, stores it to
|
on Unix environment. It reads text from an input stream, stores it to
|
||||||
pattern space, manipulates the pattern space by applying a set of editing
|
pattern space, manipulates the pattern space by applying a set of editing
|
||||||
commands, and writes the pattern space to an output stream. Typically, the
|
commands, and writes the pattern space to an output stream. Typically, the
|
||||||
input and output streams are a console or a file.
|
input and output streams are a console or a file.
|
||||||
|
|
||||||
@b QSESED is an embeddable stream editor that supports most of
|
Commands
|
||||||
the conventional sed commands and implements input and output streams as a
|
--------
|
||||||
callback function:
|
|
||||||
|
|
||||||
- #qse_sed_t - C type that encapsulates a stream editor
|
|
||||||
- QSE::Sed - C++ class that wraps #qse_sed_t
|
|
||||||
- QSE::StdSed - C++ child class of QSE::Sed that implements standard input and output streams
|
|
||||||
|
|
||||||
@code
|
|
||||||
#include <qse/sed/StdSed.hpp>
|
|
||||||
#include <qse/cmn/main.h>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#ifdef QSE_CHAR_IS_MCHAR
|
|
||||||
# define xcout std::cout
|
|
||||||
#else
|
|
||||||
# define xcout std::wcout
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int sed_main (int argc, qse_char_t* argv[])
|
|
||||||
{
|
|
||||||
if (argc < 2 || argc > 4)
|
|
||||||
{
|
|
||||||
xcout << QSE_T("USAGE: ") << argv[0] <<
|
|
||||||
QSE_T(" command-string [input-file [output-file]]") << std::endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
QSE::StdSed sed;
|
|
||||||
|
|
||||||
if (sed.open () == -1)
|
|
||||||
{
|
|
||||||
xcout << QSE_T("ERR: cannot open - ") << sed.getErrorMessage() << std::endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sed.compile (argv[1]) == -1)
|
|
||||||
{
|
|
||||||
xcout << QSE_T("ERR: cannot compile - ") << sed.getErrorMessage() << std::endl;
|
|
||||||
sed.close ();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
qse_char_t* infile = (argc >= 3)? argv[2]: QSE_NULL;
|
|
||||||
qse_char_t* outfile = (argc >= 4)? argv[3]: QSE_NULL;
|
|
||||||
QSE::StdSed::StdStream stream (infile, outfile);
|
|
||||||
|
|
||||||
if (sed.execute (stream) == -1)
|
|
||||||
{
|
|
||||||
xcout << QSE_T("ERR: cannot execute - ") << sed.getErrorMessage() << std::endl;
|
|
||||||
sed.close ();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sed.close ();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qse_main (int argc, qse_achar_t* argv[])
|
|
||||||
{
|
|
||||||
return qse_runmain (argc, argv, sed_main);
|
|
||||||
}
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
@section sed_command COMMAND
|
|
||||||
|
|
||||||
A sed command is composed of:
|
A sed command is composed of:
|
||||||
|
|
||||||
- line selector (optional)
|
- line selector (optional)
|
||||||
- ! (optional)
|
- ! (optional)
|
||||||
- command code
|
- command code
|
||||||
- command arguments (optional, dependent on command code)
|
- command arguments (optional, dependent on command code)
|
||||||
|
|
||||||
A line selector selects input lines to apply a command to and has the following
|
A line selector selects input lines to apply a command to and has the following
|
||||||
forms:
|
forms:
|
||||||
- address - specify a single address
|
- address - specify a single address
|
||||||
- address,address - specify an address range
|
- address,address - specify an address range
|
||||||
- start~step - specify a starting line and a step.
|
- start~step - specify a starting line and a step.
|
||||||
#QSE_SED_STARTSTEP enables this form.
|
#QSE_SED_STARTSTEP enables this form.
|
||||||
|
|
||||||
An @b address is a line number, a regular expression, or a dollar sign ($)
|
An @b address is a line number, a regular expression, or a dollar sign ($)
|
||||||
while a @b start and a @b step is a line number.
|
while a @b start and a @b step is a line number.
|
||||||
|
|
||||||
A regular expression for an address has the following form:
|
A regular expression for an address has the following form:
|
||||||
- /rex/ - a regular expression @b rex is enclosed in slashes
|
- /rex/ - a regular expression @b rex is enclosed in slashes
|
||||||
- \\CrexC - a regular expression @b rex is enclosed in @b \\C and @b C
|
- \\CrexC - a regular expression @b rex is enclosed in @b \\C and @b C
|
||||||
where @b C can be any character.
|
where @b C can be any character.
|
||||||
|
|
||||||
It treats the @b \\n sequence specially to match a newline character.
|
It treats the @b \\n sequence specially to match a newline character.
|
||||||
|
|
||||||
Here are examples of line selectors:
|
Here are examples of line selectors:
|
||||||
- 10 - match the 10th line
|
- 10 - match the 10th line
|
||||||
- 10,20 - match lines from the 10th to the 20th.
|
- 10,20 - match lines from the 10th to the 20th.
|
||||||
- /^[[:space:]]*$/ - match an empty line
|
- /^[[:space:]]*$/ - match an empty line
|
||||||
- /^abc$/,/^def$/ - match all lines between @b abc and @b def inclusive
|
- /^abc$/,/^def$/ - match all lines between @b abc and @b def inclusive
|
||||||
- 10,$ - match the 10th line down to the last line.
|
- 10,$ - match the 10th line down to the last line.
|
||||||
- 3~4 - match every 4th line from the 3rd line.
|
- 3~4 - match every 4th line from the 3rd line.
|
||||||
|
|
||||||
Note that an address range always selects the line matching the first address
|
Note that an address range always selects the line matching the first address
|
||||||
regardless of the second address; For example, 8,6 selects the 8th line.
|
regardless of the second address; For example, 8,6 selects the 8th line.
|
||||||
@ -289,29 +223,25 @@ Prints the last line. If #QSE_SED_QUIET is on, try <b>$p</b>.
|
|||||||
- <b>1!G;h;$!d</b>
|
- <b>1!G;h;$!d</b>
|
||||||
Prints input lines in the reverse order. That is, it prints the last line
|
Prints input lines in the reverse order. That is, it prints the last line
|
||||||
first and the first line last.
|
first and the first line last.
|
||||||
@code
|
|
||||||
$ echo -e "a\nb\nc" | qsesed '1!G;h;$!d'
|
$ echo -e "a\nb\nc" | qsesed '1!G;h;$!d'
|
||||||
c
|
c
|
||||||
b
|
b
|
||||||
a
|
a
|
||||||
@endcode
|
|
||||||
|
|
||||||
- <b>s/[[:space:]]{2,}/ /g</b>
|
- <b>s/[[:space:]]{2,}/ /g</b>
|
||||||
Compacts whitespaces if #QSE_SED_REXBOUND is on.
|
Compacts whitespaces if #QSE_SED_REXBOUND is on.
|
||||||
|
|
||||||
- <b>C/d:,f3,1/</b>
|
- <b>C/d:,f3,1/</b>
|
||||||
Prints the third field and the first field from a colon separated text.
|
Prints the third field and the first field from a colon separated text.
|
||||||
@code
|
|
||||||
$ head -5 /etc/passwd
|
|
||||||
root:x:0:0:root:/root:/bin/bash
|
|
||||||
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
|
|
||||||
bin:x:2:2:bin:/bin:/bin/sh
|
|
||||||
sys:x:3:3:sys:/dev:/bin/sh
|
|
||||||
sync:x:4:65534:sync:/bin:/bin/sync
|
|
||||||
$ qsesed '1,3C/d:,f3,1/;4,$d' /etc/passwd
|
|
||||||
0 root
|
|
||||||
1 daemon
|
|
||||||
2 bin
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
*/
|
$ head -5 /etc/passwd
|
||||||
|
root:x:0:0:root:/root:/bin/bash
|
||||||
|
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
|
||||||
|
bin:x:2:2:bin:/bin:/bin/sh
|
||||||
|
sys:x:3:3:sys:/dev:/bin/sh
|
||||||
|
sync:x:4:65534:sync:/bin:/bin/sync
|
||||||
|
$ qsesed '1,3C/d:,f3,1/;4,$d' /etc/passwd
|
||||||
|
0 root
|
||||||
|
1 daemon
|
||||||
|
2 bin
|
15
qse/doc/page/sed-embed.md
Normal file
15
qse/doc/page/sed-embed.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
QSESED Embedding Guide {#sed-embed}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Overview
|
||||||
|
--------
|
||||||
|
|
||||||
|
|
||||||
|
Embedding In C++
|
||||||
|
----------------
|
||||||
|
|
||||||
|
The QSE::Sed and QSE::StdSed classes are provided for C++. The sample here shows
|
||||||
|
how to embed QSE::StdSed for stream editing.
|
||||||
|
|
||||||
|
\includelineno sed02.cpp
|
||||||
|
|
Loading…
Reference in New Issue
Block a user