【问题标题】:Read variable matched by a .* operation读取由 .* 操作匹配的变量
【发布时间】:2023-03-20 07:41:02
【问题描述】:

修改后的工作解决方案:

sed -r "s/(\.*)\[/\1\r[/g"

更好的解决方案:

sed -r "s/(.*)\[/\1\r[/g"

分解:

s/
(\.*)\[    -String to Capture followed by [
/
\1\r[      -Line to replace with
/g" 

I believe for subsequent strings, more of these are made
(\.*) but in the same order they appear from left to right, the variables are referenced.

请尝试将答案保留为有效的 sed 行,并附上替换操作的描述

我确实想学习如何在 sed 中使用变量。因此,如果您有其他解决方案,我会全力以赴,但我真的很想学习如何在 sed 中操作变量。

我试过了

$1、%1 和 1

作为这些的组合 \$1, \%1 \1 和 /$1 /%1 /1

无济于事。

这是我用空白部分替换匹配部分的起始工作脚本。

sed -e "s/\.*\[//g" testfile.txt

我想要对脚本做的是替换(* 表示任何先前的(非空白)字符串)

*[ 

with(中间没有空行或制表符)

*
[

所以我想到了类似的东西

C:\temp>sed -e "s/\.*\[/\1/g" testfile.txt
sed: -e expression #1, char 12: invalid reference \1 on `s' command's RHS

【问题讨论】:

  • 请尽量将答案保留为工作 sed 行,并附上替换操作的描述。
  • 您的输入和预期输出是什么?
  • 输出在问题中
  • 如果你想使用\1需要捕获与\(...\)匹配的部分
  • 您能提供一个工作示例吗?你在谈论这样的事情吗? stackoverflow.com/questions/16637799/…

标签: regex variables sed


【解决方案1】:

我想你想要这样的东西:

$ cat file.txt 
this should be the first line*[and this should be the second
$ sed -r 's/([^*]*\*)/\1\n/' file.txt 
this should be the first line*
[and this should be the second

请注意,使用-r 选项意味着您不需要转义括号。如果您不使用-r,则必须将( 替换为\(,并将) 替换为\) 第一个捕获组在第一个括号内

([^*]*\*)

捕获第一个 * 之前(包括)之前的所有内容。

替换 (\1\n) 打印第一个捕获组,然后是换行符,然后是该行的其余部分。

如果你真的有兴趣学习sed,请查看this tutorial

【讨论】:

  • 替换操作的描述?这是一个捕获组还是什么? (.*?*)。我希望如何通过这篇文章学习变量。没有上下文和解释你是如何从我的旧方法到这个的。我什么都学不到。由于 sed 线的性质, -r 是否必要?顺便说一句,我使用的是 gnuwin32,所以我的 sed 参数需要“” vs '',但我知道如何解决......我什至没有在你的 sed 行中看到结束 /g。
  • 我不希望匹配“第二”行顺便说一句。我特别有这个问题仅限于星[与星[星。通过在[处中断,该点之后的数据自然会落后于[
  • $ sed -r 's/(.*?*)([)/\1\n\2/' file.txt
  • 谢谢!这真的解释了很多!
  • @Unihedron 不确定* 是否必须在sed 的字符类中转义(我知道通常它是按字面意思处理的,但sed 可能对元字符很奇怪)跨度>
【解决方案2】:

要使用您所描述的变量,您需要\(\) 对要引用的部分进行分组。所以在你的情况下你想做

sed -e 's/\(\.*\)\[/\1\r\n[/g' testfile.txt

所以\1指的是\(\.*\)部分。

【讨论】:

  • idkw 但这会在两者之间创建换行符,但它确实向我展示了如何捕获变量。谢谢你。删除 \n 在 shell(cmd 提示符或 cygwin)中不会输出换行符,但是当粘贴到记事本时会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 2019-06-08
  • 2011-02-13
相关资源
最近更新 更多