在相关符号前打印所有内容,并在相关符号后保留1个字符

时间:2019-09-09 22:59:54

标签: regex linux awk sed

我试图找到一种衬纸,以便在相关符号之前打印每行,并在相关符号之后仅保留1个字符:

输入:

thisis#atest
thisisjust#anothertest
just#testing

所需的输出:

thisis#a
thisjust#a
just#t

awk -F"#" '{print $1 "#" }'几乎可以给我我想要的东西,但我还需要找到一种方法来打印第二个字符。有什么想法吗?

7 个答案:

答案 0 :(得分:1)

您可以用sed代替#后第一个字符之后的内容:

sed 's/\(#.\).*/\1/'

答案 1 :(得分:0)

您可以使用grep:

$ grep -o '[^#]*#.' infile
thisis#a
thisisjust#a
just#t

这匹配#以外的字符序列,后跟#和任何字符。 -o选项仅保留匹配项本身。

答案 2 :(得分:0)

使用GNU awk中的特殊RT变量,您可以执行以下操作:

awk 'BEGIN{RS="#.|\n"}RT!="\n"{print $0 RT}'

答案 3 :(得分:0)

第一种解决方案: 。能否请您尝试以下操作。

awk 'match($0,/[^#]*#./){print substr($0,RSTART,RLENGTH)}'  Input_file

以上将按照您的要求打印其中包含#的行,并保留不包含这些行的行,以防您要完全打印这些行,然后在后面使用。

awk 'match($0,/[^#]*#./){print substr($0,RSTART,RLENGTH);next} 1'  Input_file

第二个解决方案:

awk 'BEGIN{FS=OFS="#"} {print $1,substr($2,1,1)}'  Input_file

答案 4 :(得分:0)

获取“#”的索引,然后拉出子字符串。

$ awk '{print substr($0,1,index($0,"#")+1);}' in.txt 
thisis#a
thisisjust#a
just#t

答案 5 :(得分:0)

Ravindes第二个示例的一些小变化

awk -F# '{print $1"#"substr($2,1,1)}' file
awk -F# '{print $1FS substr($2,1,1)}' file

另一种grep版本(到目前为止发布最短的版本):

grep -oP '.+?#.' file
  • o仅打印匹配项
  • P Perl正则表达式(由于+?
  • .任何字符
  • +及更多
  • ?,但终止于:
  • #
  • .再加上一个字符

如果我们不添加?。这行test#one#two变成test#one#t,而不是test#o对贪婪的+

答案 6 :(得分:0)

如果要使用awk,最简单的方法是使用index来查找字符的位置:

awk 'n=index($0,'#') { print substr($0,1,n+1) }' file

但是,有较短且专用的工具。查看其他答案。