我有一个名为.ignore. 需要更换projdir. 例如:
ignore \..*
ignore README
projdir Snake
Run Code Online (Sandbox Code Playgroud)
我需要将 Snake 替换为例如“PacMan”。我阅读了手册页,但我不知道该怎么做。
在 vim 中,我有时有机会替换一行中匹配的前几次出现,但不是每个人都喜欢g。例如:
a a a a a
Run Code Online (Sandbox Code Playgroud)
到
b b b a a
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用:s/a/b/[enter]:[up][enter]:[up][enter],但是重复 3 次就够乏味了,我有可能有 10 多个替换的行。
我试过了:
:s/a/b/3g: vim 抱怨尾随字符。:s/a/b/3: 更改此行和以下两行的第一次出现。3:s/a/b: 和以前一样。 :s/a/b/g3: 更改此行和接下来的两行中出现的所有内容。:3s/a/b: 更改第 3 行的第一次出现。:/a/,3/a/s/a/b:更改文件中a包含的下一行和第三行之间的每一行的第一次出现a(必要时提示反转)。:/a/,/\([^a]*a\)\{3\}/s/a/b/: 更改此行和下一行之间每行的第一个匹配项,其中包含 3a秒(这不容易扩展到多字符搜索)。以及其他各种寻址模式,都没有奏效。我必须说,我已经学到了很多关于:s试图找到这个问题的答案的命令,但我仍然没有解决它。
有人知道怎么做吗?
(特定范围的奖励积分,例如第二次到第四次出现)
在 中vim,我知道我可以在区分大小写或不区分大小写的情况下进行搜索。但是,如果我想搜索大写或小写的字符串,并用相同大小写的替换来替换它,这是否可以在单个:s///?
例如,我想更改这些行:
short
Short
SHORT
Run Code Online (Sandbox Code Playgroud)
到
long
Long
LONG
Run Code Online (Sandbox Code Playgroud)
我可以用三个:s命令来做到这一点,或者一个不敏感:s并手动修复案例,但有更好的方法吗?保留大小写的搜索和替换?
我正在寻找一种方法来用具体的值替换模板文件中的占位符字符串,使用常见的 Unix 工具(bash、sed、awk,也许是 perl)。替换在单次通过中完成很重要,也就是说,已经扫描/替换的内容不得考虑用于另一次替换。例如,这两次尝试都失败了:
echo "AB" | awk '{gsub("A","B");gsub("B","A");print}'
>> AA
echo "AB" | sed 's/A/B/g;s/B/A/g'
>> AA
Run Code Online (Sandbox Code Playgroud)
在这种情况下,正确的结果当然是 BA。
一般来说,该解决方案应该等同于从左到右扫描输入以寻找与给定替换字符串之一的最长匹配,并且对于每个匹配,执行替换并从输入中的那个点继续(没有已经读取的输入也不应该考虑进行匹配的替换)。实际上,细节并不重要,只是替换的结果永远不会被完全或部分地考虑用于另一个替换。
注意我只是在寻找正确的通用解决方案。请不要提出对某些输入(输入文件、搜索和替换对)失败的解决方案,尽管它们看起来不太可能。
我想tr是一种更核心的方法,因此可能是替换给定文件中内容的更快方法。
但是 tr 只能替换等量的字符。意义...
2 个字符只能替换为 2 个字符,即替换
\r\nwith\n是不可能通过tr
是下一个最佳选择sed吗?
是sed最核心和最快捷的方式来代替\r\n用\n在一个文件中给出的缺乏TR能力?
如果可能,想要一个例子。
我有一个大文件,其中包含数百个以下形式的英语短语:
\n\\phrase\n{. . . * * }\n{I shoul-d've stayed home.}\n{a\xc9\xaa \xca\x83\xca\x8ad\xe2\x80\xbf\xc9\x99v \xcb\x88ste\xc9\xaad \xcb\x88ho\xca\x8am.} <- only replace on this line\n\n\\phrase\n{ . . * }\n{Did you eat?}\n{d\xc9\xaad\xca\x92j\xca\x8a\xca\xb7\xcb\x88it? \xe2\x86\x97} <- only replace on this line\n\n\\phrase\n{ * . * . * . . . * . }\n{Yeah, I made some pas-ta if you're hun-gry.}\n{\xcb\x88j\xc9\x9b\xc9\x99, a\xc9\xaa \xcb\x88me\xc9\xaad s\xc9\x99m \xcb\x88p\xc9\x91 st\xc9\x99\xca\xb7\xc9\xaaf j\xc9\x99r \xcb\x88h\xca\x8c\xc5\x8b gri.} <- only replace on this line\nRun Code Online (Sandbox Code Playgroud)\n这是一个 LaTeX.tex文件。我想用符号(十六r进制代码)替换每个音标中的所有字符(通过音标,我的意思是该\\phrase行之后的每三行)\xc9\xb9U+0279。
在 Emacs …
有没有办法告诉sed在每第二次出现时替换模式?或者至少每隔一行?(当然可以使用脚本,但我问自己是否sed可以做到)。
编辑
我发现
sed -e "s/pattern/replacement/g;n"
Run Code Online (Sandbox Code Playgroud)
但它取代了每一次出现,而不是第二次。
例子
输入文件:
I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern
Run Code Online (Sandbox Code Playgroud)
期望的输出:
I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement
Run Code Online (Sandbox Code Playgroud) 可以sed做类似的事情:
12345
Run Code Online (Sandbox Code Playgroud)
变得 :
1&2&3&4&5
Run Code Online (Sandbox Code Playgroud)
?
我正在尝试使用 jq 来改变孩子的价值。例如,我想将“test2”的值从 ["yo", "bye"] 更改为 ["hi"]。
{
"title": "hello",
"body": {
"test1": 123,
"test2": [
"yo",
"bye"
]
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我只能更改作为根子项的键的值。我不知道如何使用它并转到 .body.test2 而不是标题:
cat test.conf | jq 'to_entries | map(if .key == "title" then . + {"value":"hello world"} else . end) | from_entries' > test2.conf
Run Code Online (Sandbox Code Playgroud)