我不明白,如何使用sed或awk来修剪文件中的字符串。我一直在寻找许多小时,但没有理想的结果.我有一个字符串这样的。
c=one, o=roll, root ca valid until: date
c=one, o=roll, root ca Located: location
c=two roll, root ca valid until: date
c=two roll, root ca Located: location
我想要的输出是列式排列
c=one valid until: date
c=one Located: location
c=two roll valid until: date
c=two roll Located: location
我使用sed命令,但它并不像其他许多命令那样工作。
sed 's/,.*\^([valid])//g' file.txt
但我不能找出第二个条件,直到单词 "有效",此外 "有效 "和 "位置 "在同一个命令。
$ sed -E 's/,.*(valid|Located)/ \1/' ip.txt
c=one valid until: date
c=one Located: location
你可以把术语 valid
, Located
(以及其他任何你想要的术语)在一个交替的捕获组内。然后使用反向引用 \1
在替换部分把它放回去。
为了对齐输出,你可以使用一些字符,如 |
输入中没有出现,然后用 column
指挥
$ sed -E 's/,.*(valid|Located)/|\1/' ip.txt | column -t -s'|'
c=one valid until: date
c=one Located: location
c=two roll valid until: date
c=two roll Located: location
您不必依赖 valid
或 Located
用下面的命令,那里可以有任何字。
sed 's/,.*[^ ]\( *[^ ][^:]*:\)/\1/' file
或者,你可以强制匹配到 valid
或 Located
使用
sed -E 's/,.*[^[:space:]]([[:space:]]{2,}(valid|Located))/\1/' file
sed -E 's/,.*\S(\s{2,}(valid|Located))/\1/' file # If \s and \S are supported
哪儿 (valid|Located)
匹配 valid
或 Located
字符序列。请注意,对于OR |
操作符,你需要在POSIX BRE模式中转义它,或者用 -E
选项,如上图所示。
参见 在线 sed
演示#1 和a 演示#2. 详情
,
- 逗号.*
- 匹配任意0个或以上的字符[^ ]
- 然后找到一个非空格字符\( *[^ ][^:]*:\)
- 采集到的数据被归入第1组(\1
) 2个或更多的空格,后面是一个非空格字符([^ ]
),然后是0个或更多除 :
([^:]*
),然后是一个 :
.您可以将空格替换为 \s
(如果支持)或 [[:space:]]
来匹配任何空格,以及 [^ ]
与 [^[:space:]]
或 \S
(如果支持)。
请你尝试以下,测试和编写与所示的样品。
awk -F'[, ]' 'match($0,/ +valid.*| +Located.*/){print $1,substr($0,RSTART,RLENGTH)}' Input_file
我会删除所有的东西,直到多个连续的空格,假设左列没有双空格。
s/,.* / /