我有许多文件要通过用另一个多行字符串替换一个多行字符串来更新。类似的东西:
* Some text,
* something else
* another thing
Run Code Online (Sandbox Code Playgroud)
我想将其替换为:
* This is completely
* different text
Run Code Online (Sandbox Code Playgroud)
结果将是替换后包含第一个文本块的文件现在将包含第二个字符串(文件的其余部分不变)。
部分问题是我必须在文件系统中找到要更新的文件列表。我想我可以为此使用 grep(尽管这对于多行字符串来说并不容易),然后将其通过管道传输到 sed 中?
是否有捷径可寻?Sed 是一个选项,但它很尴尬,因为我必须添加 \n 等。有没有办法说“从这个文件中获取输入,在这些文件中匹配它,然后用另一个文件的内容替换它”?如果需要,我可以使用 python,但我想要一些快速而简单的东西,所以如果有可用的实用程序,我宁愿使用它而不是编写自己的脚本(我知道该怎么做)。
我确实尝试过sedand awk,但它不起作用,因为字符所涉及的字符/已经在命令中作为分隔符存在。
请让我知道我怎样才能做到这一点。
下面是一个示例示例。我们要删除评论部分,即/*.....*/
/*This is to print the output
data*/
proc print data=sashelp.cars;
run;
/*Creating dataset*/
data abc;
set xyz;
run;
Run Code Online (Sandbox Code Playgroud) 我必须用另一个文本块替换文件中的一大块文本(shell 脚本代码)。
我对如何使用 sed 替换多行字符串印象深刻?由antak回答 ,多线替换由Bruce Ediger回答
但是我在使用它们时遇到了一些麻烦。
antak在他的回答中已经提到,1h;2,$H;$!d;g;对于大文件,不建议将整个文件 ( )流式传输到缓冲区,因为它会导致内存过载。
我知道sed可以与块功能一起使用以保持块外的文本不变。我想使用这个功能。但如果我使用,
sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
Run Code Online (Sandbox Code Playgroud)它将为每个流重复插入新文本(代码)。因此,我必须将可视块作为一个流,使用类似于antak之前建议的内容,但用于块(不是用于整个文件)。
正如Bruce Ediger提到的,可以尝试以(点)ex开头的附加功能,但我的新文本(代码)包含以点开头的行,这可能被认为是附加语法的点。在这种情况下我该如何使用它?a.
ex's dd'number of lines' 可能会删除多行,但是如果我在 /marker1/ 和 /marker2/ 之间有一个块,其中的行数不固定(变化)将被替换为新文本(代码),该怎么办它 ?
我正在尝试使用正则表达式创建 sed 命令,以便仅在没有注释的情况下替换文本文件中的某些内容,但由于我几乎不了解 sed 命令的知识,我遇到了一些麻烦。
我为问题的一小部分找到了解决方案,但有些还不够完整,或者我无法将它们放在一起。TL; DR 版本在最后可用。
让我们先确定我的最终目标
只有在没有注释的情况下,我才想在文本文件中匹配任何内容(如任何常规正则表达式(呵呵))。因为我想为多种语言做这件事,让我们只看常见的 C 注释。
因此,在这种情况下,可以以不同方式对单词或行进行注释。我们//只有评论线路上的下一个内容,我们还有/* */评论块。
环境
我目前正在使用仅支持 POSIX sed 的 Mac OSX,但我安装了一个我发现更好的 GNU-sed。(感谢Homebrew. 包是gnu-sed,命令是gsed。)所以,如果您喜欢使用其中一种或另一种,我可以使用它们。
我在写这篇文章时假设使用了 GNU-sed。
忽略一个案例
第一个问题,如何忽略某些情况。我在这个话题中很容易地发现了这一点。
现在,这//部分对我来说似乎很容易做,我只需要添加一个OR ( |)条件即可将其与另一个条件连接起来。
它看起来像这样:
sed -E "/\/\/.*/! s/foo/bar/" file
Run Code Online (Sandbox Code Playgroud)
然后,如果输入文件是:
foo
42
test
//foo
//42
// foo
//something foo
foo
42
something foo
foo
Run Code Online (Sandbox Code Playgroud)
输出是:
bar
42
test
//foo
//42
// …Run Code Online (Sandbox Code Playgroud) 所以我有一个任务,我必须通过 bash shell 脚本来操作 XML 文件。
以下是步骤:
以下是删除了非必要信息的 XML 示例:
<fmreq:fileManagementRequestDetail xmlns:fmreq="http://foobar.com/filemanagement">
<fmreq:property>
<fmreq:name>form_category_cd</fmreq:name>
<fmreq:value>Memos</fmreq:value>
</fmreq:property>
<fmreq:property>
<fmreq:name>object_name</fmreq:name>
<fmreq:value>Correspondence</fmreq:value>
</fmreq:property>
</fmreq:fileManagementRequestDetail>
Run Code Online (Sandbox Code Playgroud)
我必须从 object_name 下的 value 元素中获取值,交叉引用它,然后用新值替换 form_category_cd value 元素下的值:
因此,如果 object_name -> value 是 Correspondence,那么 form_category_cd -> value 可能需要是 YYZ。
问题是,我只能使用我们服务器上可用的工具,因为我们的操作组限制我们使用手头的工具。这是一场争取更新 xmllint 然后被否决的斗争。我使用的版本不支持--xpath,相信我在美好的一天很难。此外,我可用的版本不支持命名空间,因此 xmllint 已出局。
我试过 sed,但它似乎不喜欢我的正则表达式,即使我尝试的每个测试器都工作正常。
正则表达式:
(<fmreq\:name>object_name<\/fmreq\:name>)(?:\n\s*)(<fmreq\:value>)(.*)(<\/fmreq\:value>)
Run Code Online (Sandbox Code Playgroud)
我需要获得第 3 组,但 sed 不会返回它。相反,它返回 XML 文件的全部内容。
sed -e 's/\(<fmreq\:name>object_name<\/fmreq\:name>\)\(?:\n\s*\)\(<fmreq\:value>\)\(.*\)\(<\/fmreq\:value>\)/\3/' < c3.xml
Run Code Online (Sandbox Code Playgroud)
我对 awk / gawk 不太熟悉,所以我也在努力弄清楚它们,但如果能找到解决方案,我会向他们开放。
很想有一个 awk / gawk 解决方案,只是为了让老板高兴,因为他是 awk 的老粉丝,但我会尽我所能,因为我很难过。
我再次必须使用手头的工具并且无法安装任何新的东西。
我有一个制表符分隔的文本文件,其中带有字符串的第 23 列中包含 \n,这导致它中断到下一行。
我在 vi 中打开了文本文件并启用了空白字符,我可以看到 DESCR2 字段中的值有空行打破了字符串。
该字符串包含在制表符分隔的字符中,我试图删除 \n 并将字符串连接到 ABC 123 而仍然在 1 field 中。
我试过,tr -d '\n' < file.txt但这会使所有的行变成 1 行。我只想从该列中删除 \n\n。
我也试过了,sed 's/\n\n//' file.txt但是没有效果。我可以在 vi 中搜索和替换 \n\n 但我无法使用 sed 获得相同的结果。
例子:
\t"ABC\n
\n
123"\t
Run Code Online (Sandbox Code Playgroud)
期望的输出:
\t"ABC 123"\t
Run Code Online (Sandbox Code Playgroud) 如何使用多行模式在 bash 中进行字符串替换?
为了说明,我提供了一个伪代码:
TARGET_STR=' $N = "magic_quotes_gpc = <b>"._("On")."</b>";
$D = _("Increase your server security by setting magic_quotes_gpc to 'on'. PHP will escape all quotes in strings in this case.");
$S = _("Search for 'magic_quotes_gpc' in your php.ini and set it to 'On'.");
$R = ini_get('magic_quotes_gpc');
$M = TRUE;
$this->config_checks[] = array("NAME" => $N , "DESC" => $D , "RESULT" => $R , "SOLUTION" => $S , "MUST" => $M );'
REPLACE_STR=' /* NOTE: "Magic_quotes_gpc" is no longer required. …Run Code Online (Sandbox Code Playgroud) 我有样品:
"name": "The title of website",
"sync_transaction_version": "1",
"type": "url",
"url": "https://url_of_website"
Run Code Online (Sandbox Code Playgroud)
我想获得以下输出:
"The title of website" url_of_website
Run Code Online (Sandbox Code Playgroud)
我需要从 URL 中删除协议前缀,这样就只剩url_of_website下了(http前面没有)。问题是我不太熟悉sed阅读多行,做了一些研究到我https://unix.stackexchange.com/a/337399/256195,仍然无法产生结果。
我试图解析的有效 json 对象是Bookmarkgoogle chrome ,示例:
{
"checksum": "9e44bb7b76d8c39c45420dd2158a4521",
"roots": {
"bookmark_bar": {
"children": [ {
"children": [ {
"date_added": "13161269379464568",
"id": "2046",
"name": "The title is here",
"sync_transaction_version": "1",
"type": "url",
"url": "https://the_url_is_here"
}, {
"date_added": "13161324436994183",
"id": "2047",
"meta_info": {
"last_visited_desktop": "13176472235950821"
},
"name": "The title here",
"sync_transaction_version": …Run Code Online (Sandbox Code Playgroud) 我正在尝试替换 YAML 文件的以下部分:
ssl:
enabled: false
Run Code Online (Sandbox Code Playgroud)
阅读
ssl:
enabled: true
Run Code Online (Sandbox Code Playgroud)
我试过这个,失败了: sed -i s/ssl:\n enabled: false/ssl:\n enabled: true/g
假设我有一个文本文件,我想用 中包含的另一个字符串text.txt替换 中 中包含的(多行)字符串,我该怎么做?(我不想使用正则表达式,我实际上想用 中包含的文本替换 中包含的字符串。before.txtafter.txtbefore.txtafter.txttext.txt
我希望使用以下建议的方法: https://unix.stackexchange.com/a/26289/288916
我试过:
perl -i -p0e 's/`cat before.txt`/`cat after.txt`/se' text.txt
Run Code Online (Sandbox Code Playgroud)
但是,除非我是一个十足的白痴并且搞砸了一些琐碎的事情,否则我不能简单地将其扩展为加载要从带有 cat 的文件中找到的字符串。
也许转义出了问题。该文件before.txt包含诸如/[]".
谢谢@ilkkachu,我尝试过:
perl -i -0 -pe '$b = `cat before.txt`; $a = `cat after.txt`; s/\Q$b\E/$a/s\' text.txt
Run Code Online (Sandbox Code Playgroud)
,但它仍然无法正常工作。我通过确保 before 中的字符串与要替换字符串的整行完全匹配来使其在一个实例中工作。但它不起作用,例如替换在行开头找不到的字符串。示例:text.txt文件包含:
Here is
some text.
Run Code Online (Sandbox Code Playgroud)
before.txt包含:text
after.txt包含:whatever
没有机会。