使用awk或sed如何选择两种不同标记图案之间的线条?可能有多个标有这些图案的部分.
例如:假设文件包含:
abc
def1
ghi1
jkl1
mno
abc
def2
ghi2
jkl2
mno
pqr
stu
Run Code Online (Sandbox Code Playgroud)
并且起始模式是abc和结束模式是mno
So,我需要输出为:
def1
ghi1
jkl1
def2
ghi2
jkl2
Run Code Online (Sandbox Code Playgroud)
我使用sed匹配模式一次:
sed -e '1,/abc/d' -e '/mno/,$d' <FILE>
Run Code Online (Sandbox Code Playgroud)
有没有办法在sed或awk 反复做,直到文件的结尾?
例如bash,在C/C++中众所周知的前向声明是否有类似的东西或至少类似的东西(解决方法)?
或者有这样的事情,因为例如它总是一次性执行(一行一行)?
如果没有前向声明,我该怎么做才能使我的脚本更容易阅读.它相当长,这些函数定义在开始时与全局变量混合,使我的脚本看起来很难看,难以阅读/理解)?我要求学习一些这些案例的知名/最佳实践.
例如:
# something like forward declaration
function func
# execution of the function
func
# definition of func
function func
{
echo 123
}
Run Code Online (Sandbox Code Playgroud) 我想通过命令行列出已安装的sdk软件包.(由于某些原因我无法使用GUI)
我做了一些研究,发现了几个命令来列出远程服务器上的可用软件包,但是我找不到任何命令来列出已安装的sdk软件包.
谢谢
我有一个ASCII日志文件,其中包含一些我想要提取的内容.我从来没有花时间适当地学习Perl,但我认为这是完成这项任务的好工具.
该文件的结构如下:
... ... some garbage ... ... garbage START what i want is on different lines END ... ... more garbage ... next one START more stuff I want, again spread through multiple lines END ... more garbage
所以,我正在寻找一种方法来提取每个START和END分隔符字符串之间的行.我怎样才能做到这一点?
到目前为止,我只找到了一些关于如何使用START字符串打印行的示例,或者其他与我正在寻找的内容有些相关的文档项.
示例文件:
Pattern 1
AAAAAAAAAA
BBBBBBBBBB
Pattern 2
Run Code Online (Sandbox Code Playgroud)
我想在一行中打印文件中两个模式之间的行。来自上一个问题如何在两个模式之间打印线,包含或不包含(在 sed、AWK 或 Perl 中)?我发现非常好
awk '/Pattern 1/{flag=1; next} /Pattern 2/{flag=0} flag' file
Run Code Online (Sandbox Code Playgroud)
有输出:
AAAAAAAAAA
BBBBBBBBBB
Run Code Online (Sandbox Code Playgroud)
我想要的输出:
AAAAAAAAAABBBBBBBBBB
Run Code Online (Sandbox Code Playgroud) 我基本上想给我写一个bash脚本,在那里我使用heredoc生成几个大文件; 然后使用这些文件运行一些命令.
据了解,(显然)heredoc文件需要在命令运行之前生成 - 但是,在这种安排中令我恼火的是,在编写命令代码之前,我还必须编写'heredoc'语句代码.
所以我以为我会在一个函数中编写heredoc语句 - 但这里仍然存在同样的问题:第24章.函数说:
函数定义必须在第一次调用之前.没有"声明"该功能的方法,例如,在C中.
的确如此:
$ cat > test.sh <<EOF
testo
function testo {
echo "a"
}
EOF
$ bash test.sh
test.sh: line 1: testo: command not found
Run Code Online (Sandbox Code Playgroud)
然后我想也许我可以放置一些标签并跳转GOTO,如(伪代码):
$ cat > test.sh <<EOF
goto :FUNCLABEL
:MAIN
testo
goto :EXIT
:FUNCLABEL
function testo {
echo "a"
}
goto MAIN
:EXIT
Run Code Online (Sandbox Code Playgroud)
...但事实证明BASH goto也不存在.
我唯一的目标是 - 我想首先编写脚本文件的"核心",这是一些五六个命令; 只有然后写在脚本文件中的定界符语句(可能有数百行); 首先拥有heredocs真的让我难以阅读代码.有没有办法实现这一目标?
我需要从一个巨大的文件中提取两个匹配模式之间的特定行.
假设pattern1(在文件中唯一)匹配特定的line # n和pattern2 (在文件中不唯一)匹配之后的line # m下一个立即匹配line # n.然后我想提取之间和之间的所有行line #n to #m
示例文件内容
***************************************************************************
text line # n-2
text line # n-1
********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************
text line # m+1
text line # m+2
***************************************************************************
Run Code Online (Sandbox Code Playgroud)
期望的输出
********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************
Run Code Online (Sandbox Code Playgroud)
如果你能帮我解决这个问题,我们将不胜感激
我经常发现自己写的Awk单行代码随着时间的流逝变得越来越复杂。
我知道我总是可以创建一个Awk文件来继续添加用例,但是它肯定不如在命令行上更改文本有用。
为此:有什么方法可以漂亮地打印Awk的代码,从而使我更有意义?
例如,鉴于此:
awk 'flag{ if (/PAT2/){printf "%s", buf; flag=0; buf=""} else buf = buf $0 ORS}; /PAT1/{flag=1}' file
Run Code Online (Sandbox Code Playgroud)
如何获得更具可读性的内容?
我在 Markdown 中有一个更改日志文件,其中包含我的应用程序的每个版本之间的所有更改,如下所示:
## Version 1.0.6
* first change
* second change
* third change
## Version 1.0.5
* first foo change
* second foo change
## Version 1.0.4
* and so on...
Run Code Online (Sandbox Code Playgroud)
我想要的是在脚本中提取版本的更改内容。例如,我会提取版本 1.0.5的更改,因此它应该打印:
* first foo change
* second foo change
Run Code Online (Sandbox Code Playgroud)
理想的方法是./getVersionChanges version filename这两个参数:
version :提取更改的版本
filename : 要解析的文件名
我怎样才能用 sed、awk、grep 或其他什么来实现这一点?
我想在 UNIX 中使用sed提取两个字符串之间的内容。我知道sed仅适用于一行,但就我而言,我想提取跨多行的内容。
为了让您了解情况,这里有一个字符串变量,其中包含我想要提取的行和我想要忽略的行:
VAR="Unrelevant
Unrelevant
Title1
Relevant
Relevant
Title2
Unrelevant"
Run Code Online (Sandbox Code Playgroud)
现在我想提取“Title1”和“Title2”之间的部分(包括“Title1”)并将内容保存到名为“RELEVANT”的变量中。在该变量上使用echo应该给我这个所需的输出:
Title1
Relevant
Relevant
Run Code Online (Sandbox Code Playgroud)
我的尝试是:
RELEVANT=(echo "$VAR" | sed -e 's/.*Title1\(.*\)Title2.*/\1/g'))
Run Code Online (Sandbox Code Playgroud)
但这仅在 VAR 是一句俏皮话时才部分起作用:
VAR="Unrelevant Unrelevant Title1 Relevant Relevant Title2 Unrelevant"
Run Code Online (Sandbox Code Playgroud)
“部分”,因为输出是:
Relevant Relevant
Run Code Online (Sandbox Code Playgroud)
...第一个“Relevant”之前有一个空格,该空格不应该存在并且没有前面的“Title1”。
好吧,除此之外,如果 VAR 跨越多条线,我就无法正常工作。所以我的问题是:如何让它适用于拉伸多行的字符串?