我有一个巨大的文本文件(~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文本编辑器。
要退出输入模式,用户应在单个句点(.)中输入一行。
假设我要输入句点作为文本。
我想到了一种解决方法:首先,我插入..。然后,我替换..为.。
但是我的方法有点笨拙。有一个更好的方法吗?
这里需要一些基本的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)
有可能吗?
假设我在ed中打开了一个文本文件,当前行看起来像这样:
This is sentence one. Here starts another one.
现在我想在后面添加换行符 one. ,这样新的句子就会Here starts占用下一行.
我如何在ed中执行此操作?
我有这个 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\nRun 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\nRun 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) 我有一个单行脚本传入foreachMakefile中的函数,如下所示:
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)