【问题标题】:How to prepend only those lines with tabs/spaces in a file, with esc character?如何仅在文件中使用 esc 字符添加制表符/空格的那些行?
【发布时间】:2014-07-21 15:44:10
【问题描述】:

描述:整行包含制表符/制表符和/或空格/空格,后跟换行符,不需要转义其他字符。在一个巨大的数据文件中散布着几行这样的行。

需要注意: 这里的空格是指(制表符或空格)不是空行。
只有换行符的空行不应放在前面(需要删除)。该去除部分可以或可以不在单衬中实现。

基本上想知道是否可以使用 sed/perl/awk 单行。

提前致谢。

我的尝试是这些但没有多大成功......

尝试了这些但没有多大成功..

sed -i 's/\^[\s\+\|\t\+]\+\$\n/\^\\[\s\+\|\t\+]\+\$\n/g' filename

perl -i -ne 'chomp; print \"\\\$_\n\" if (\$_ eq \"\")' filename

perl -pi -ne 's/\S\+/\\\S\+/g if (\$_ eq \"\")' filename

sed -i 's/\^[:space:]\+\$\n/\^\\[:space:]\+\$\n/g' filename

【问题讨论】:

  • 尝试了这些但没有多大成功.. sed -i 's/\^[\s\+\|\t\+]\+\$\n/\^\[\s\+ \|\t\+]\+\$\n/g' 文件名 perl -i -ne 'chomp; print \"\\\$_\n\" if (\$_ eq \"\")' 文件名 perl -pi -ne 's/\S\+/\\\\\S\+/g if ( \$_ eq \"\")' 文件名 sed -i 's/\^[:space:]\+\$\n/\^\[:space:]\+\$\n/g' 文件名
  • 我不清楚“...需要转义”是什么意思。您能否编辑您的帖子以包含一些示例输入和示例输出?
  • 是的,这是可能的。一些单行包含 10,000 多个字符并且完全不可读 - 因为您要求的“单行”可能是您得到的,希望没关系。
  • By 需要转义我的意思是那些行应该保留在文件中,但前面有一个 esc 字符“\”。这些行不应从文件中删除。

标签: linux perl unix awk sed


【解决方案1】:
perl -i.bak -nle 's~^(\s++)$~\\$1~; /\S/ and print' file.txt

【讨论】:

  • 谢谢似乎更适合我的目的
【解决方案2】:

要在仅包含空格的行前面加上反斜杠,您可以这样做:

awk 'NF==0 && length($0){$0="\\" $0}1' file

要同时删除空白行,您可以这样做:

awk 'NF==0 && length($0){$0="\\" $0}length($0)' file

【讨论】:

    【解决方案3】:

    您将使用 posix 字符类:

    sed -r 's/^([[:space:]]+)$/\\\1/;/^$/d' yourfile
    

    这会保留包含空格的行中的空格,只是在反斜杠前面。请注意,除了[:space:],您还可以使用[:blank:],前者匹配所有空白字符(相当于[ \t\r\n\v\f]),而后者只匹配严格的空格和制表符(相当于[ \t])。

    EDIT:我还添加了删除完全空行的命令(在 sed 命令中的分号之后)。

    【讨论】:

    • [[:space:]] 可能是矫枉过正。我的:sed -e 's|[[:blank:]]\+|\\&|; /^$/d' file
    • 感谢 Jaybee,但是使用 sed 时我遇到的问题是我在使用您的 oneliners 时遇到的问题,或者我发布的问题是“sed: -e expression #1, char 17: unterminated `s' command” 在其中一个它建议stackoverflow中的帖子.....脚本包含模式中的换行符。所以它抱怨第一行......最好使用perl的正则表达式来处理多行替换
    • 是的,我也想在我的替换字符串中使用$,但由于某些奇怪的原因,我未能正确使用它。 +1!
    • @Seeker,你确定你在例如周围使用双括号吗? :space:?此外,这可能是关于使用 + 元字符的问题,它是扩展正则表达式的一部分(由我们可以提供 sed-r 标志指示)但不是标准正则表达式的一部分...
    • @Jaybee,是的,我使用了双精度,之前用一个括号括起来:空格:,两种方式都给出了相同的问题。
    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 2011-01-30
    • 2013-10-19
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    相关资源
    最近更新 更多