我有一个巨大的文本文件(~1.5GB),其中有许多行以“.Ends”结尾。
\n我需要一个 Linux oneliner (perl\\ awk\\ sed) 来查找文件中出现的最后一个位置 '.Ends' 并在其前面添加几行。
我尝试使用tac
两次,并偶然发现了我的 perl:
当我使用:
\n tac ../../test | perl -pi -e 'BEGIN {$flag = 1} if ($flag==1 && /.Ends/) {$flag = 0 ; print "someline\\n"}' | tac
\n它首先打印“someline\\n”,然后只打印 .Ends\n结果是:
\n\xe2\x80\xa6
\n.Ends
\nsomeline
当我使用:
\n tac ../../test | perl -e 'BEGIN {$flag = 1} print ; if ($flag==1 && /.Ends/) {$flag = 0 ; print "someline\\n"}' | tac
\n它不会\xe2\x80\x99t 打印任何内容。
当我使用时:
\n tac …
我想用多行替换文件中的单行,例如,我想替换特定的函数调用,比方说,
foo(1,2)
Run Code Online (Sandbox Code Playgroud)
同
if (a > 1) {
foo(1,2)
} else {
bar(1,2)
}
Run Code Online (Sandbox Code Playgroud)
我怎么能用bash做呢?
我有几个具有不同行号的文本文件,我必须在所有这些文件中删除倒数第三行。这是一个示例文件:
bear
horse
window
potato
berry
cup
Run Code Online (Sandbox Code Playgroud)
此文件的预期结果:
bear
horse
window
berry
cup
Run Code Online (Sandbox Code Playgroud)
我们可以删除文件的倒数第三行吗
?不基于任何字符串/模式。
湾 仅基于它必须是倒数第三行的条件
我对如何从最后一行开始索引我的文件有疑问。我已经从倒数第二行的另一个 SO 问题中尝试过这个:
> sed -i 'N;$!P;D' output1.txt
Run Code Online (Sandbox Code Playgroud) 我需要您有关 XMLStarlet 命名空间的帮助。(从来没有见过一个解释得很糟糕的库)我有一个 XML 文件,例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
<ncx version="2005-1" xml:lang="fr" xmlns="http://www.daisy.org/z3986/2005/ncx/">
<head>
<meta name="dtb:uid" content="9782721213747"/>
<meta name="dtb:depth" content="1"/>
<meta name="dtb:totalPageCount" content="0"/>
<meta name="dtb:maxPageNumber" content="0"/>
</head>
<docTitle>
<text>My text</text>
</docTitle>
<navMap>
<navPoint id="NavPoint-1" playOrder="1"><navLabel><text>Couverture</text></navLabel><content src="01_cover.html"/></navPoint>
Run Code Online (Sandbox Code Playgroud)
等等。
现在,由于命名空间的存在,我在 XMLstarlet 中的查询失败了。
xmlns="http://www.daisy.org/z3986/2005/ncx/"
Run Code Online (Sandbox Code Playgroud)
我读到您可以使用 SED 删除命名空间。就像这样:
cat Myfile.ncx | sed -e 's/ xmlns.*=".*"//g' | xmlstarlet ed -d "/ncx/navMap/navPoint[@playOrder='5']"
Run Code Online (Sandbox Code Playgroud)
效果很好。问题是,我需要命名空间并且不想删除它们。
另外,我也尝试过这个:
xmlstarlet -N x="http://www.daisy.org/z3986/2005/ncx/" ed -d "/ncx/navMap/navPoint[@playOrder='5']" Myfile.ncx
Run Code Online (Sandbox Code Playgroud)
这是行不通的。(也不明白 x in x="http..." 中的 x 意味着什么,我读了一些放置“我的”,一些放置其他值...并且 XMLStarlet 页面中没有这方面的手册页) …
我正在研究ed文本编辑器。
要退出输入模式,用户应在单个句点(.
)中输入一行。
假设我要输入句点作为文本。
我想到了一种解决方法:首先,我插入..
。然后,我替换..
为.
。
但是我的方法有点笨拙。有一个更好的方法吗?
假设我在ed中打开了一个文本文件,当前行看起来像这样:
This is sentence one. Here starts another one.
现在我想在后面添加换行符 one.
,这样新的句子就会Here starts
占用下一行.
我如何在ed中执行此操作?
这里需要一些基本的unix shell:
对于我看不到" - "目标的命令,比如ed:
print '%-2p\nq' | ed -s FILE
Run Code Online (Sandbox Code Playgroud)
我可以从某个cmd的stdout而不是FILE名称提供一个流作为要处理的数据:
SomeCMD | ed -s SOMETHING_MAGICAL <<< 'print '%-2p\nq'
Run Code Online (Sandbox Code Playgroud)
有可能吗?
我有这个 ssh 配置需要编辑。
\nHost vps6\n HostName 123.456.789.00\n User dylan\n Port 123\n\nHost vps4\n HostName 123.456.789.00 \n User dylan\n Port 123\n\n# old server\n\nHost vps3-old\n HostName 123.456.789.00\n User dylan \n Port 123\n
Run Code Online (Sandbox Code Playgroud)\n我想将配置移至vps6
文件末尾并追加-old
其配置别名。生成的文件将是。
Host vps4\n HostName 123.456.789.00 \n User dylan\n Port 123\n\n# old server\n\nHost vps3-old\n HostName 123.456.789.00\n User dylan \n Port 123\n\nHost vps6-old\n HostName 123.456.789.00\n User dylan\n Port 123\n
Run Code Online (Sandbox Code Playgroud)\n我设法使用这个 sed 命令 \xe2\x86\x92 来做到这一点sed \'/\'"vps4"\'/{N;N;N;N;H;$!d}; ${p;x;s/\'"vps4"\'/\'"vps4"\'-old/}\'
,不幸的是这在文件末尾给了我不需要的换行符。
[tmp]$ sed \'/\'"vps6"\'/{N;N;N;N;H;$!d}; ${p;x;s/\'"vps6"\'/\'"vps6"\'-old/}\' config\nHost vps4\n …
Run Code Online (Sandbox Code Playgroud) 我有一个单行脚本传入foreach
Makefile中的函数,如下所示:
flag:
$(foreach f, $*.txt, printf "%s\n" 0a "$(grep -o '[0-9]\+' $f | sed 's/.*/read \"&\"/')" "" . w q | ed $f)
Run Code Online (Sandbox Code Playgroud)
这个脚本行的功能可以在这里找到.我只是感到困惑,为什么它不能以这种方式工作,因为如果我将该行放入一个单独的脚本并从Makefile中调用它,如下所示:
flag:
$(forech f, $*.txt, ./script $f)
Run Code Online (Sandbox Code Playgroud)
它工作正常.
我也试过shell for
循环如下:
flag:
for f in $*.txt ; do \
printf "%s\n" 0a "$(grep -o '[0-9]\+' $f | sed 's/.*/read \"&\"/')" "" . w q | ed $f ; \
done
Run Code Online (Sandbox Code Playgroud)
仍然没有运气.我必须触及Makefiles的一些微妙点,任何人都可以启发我吗?谢谢.
我想在给定文件上执行一系列"搜索和替换",比如file.txt.例如,
s/foo/bar/g
s/abc/xyz/g
s/pqr/lmn/
g/string-delete/d
Run Code Online (Sandbox Code Playgroud)
等等.
我是如何在脚本文件中编写所有这些操作,然后在目标file.txt上单独运行它们以将其保存到newfile.txt?
我看到这篇文章使用bash/sed搜索和替换文件中的变量,但不知何故无法让它为我工作.
编辑:我更喜欢基于vim/ed的解决方案Thanx tempora
我有一个相当大的文本文件,每个字符之间都有一个额外的空格;
我看起来像这样。
我想删除那些额外的字符
它看起来像这样。
通过 Linux 终端。我似乎无法在不删除所有空格的情况下找到这样做。在这一点上,我愿意尝试任何解决方案。我很感激任何朝着正确方向的推动。
我需要在目录及其子目录中的大量文件的顶部插入1个文件中的文本.我已经能够使用ed在逐个文件的基础上成功完成此操作:
ed -s FileToAddTo.txt <<< $'0r TextToAdd.txt\nw'
Run Code Online (Sandbox Code Playgroud)
但是,当我用*.txt替换FileToAddTo.txt时,没有任何反应.如何修改它,或使用其他Unix命令(如sed)以递归方式将TextToAdd.txt的内容添加到以特定扩展名结尾的目录中的所有文件?例如
ed -rs *.txt <<< $'0r TextToAdd.txt\nw'
Run Code Online (Sandbox Code Playgroud)
请注意,此行上方的代码不起作用,它只是演示了我想要实现的目标.
I am using this snippet code (just delete first line with ed
). I wanna know if i can make something like this in vim
. I wrote the script and passed the file as an argument.
file:
# This is a comment #
foo bar
Run Code Online (Sandbox Code Playgroud)
edit with ed
:
ed $1 << EOF
1/^[ ]*$/d
w
q
EOF
Run Code Online (Sandbox Code Playgroud)
I tried with vim
:
vi $1 << EOF
dd
w
q
EOF
> Vim: Warning: Input is not from a …
Run Code Online (Sandbox Code Playgroud)