【问题标题】:ksh grep for backslash in Linuxksh grep 用于 Linux 中的反斜杠
【发布时间】:2015-01-06 21:11:42
【问题描述】:

我有一个文件,其每行末尾的日期格式为MM\DD\YYYY。在文件的那部分之后,最后有一些我不想要的文本。我不想使用 tail 以防最后的文本行数发生变化。我只想获取所有末尾有日期的行。

我尝试了各种形式的grep,包括grep "[0-9]\\\\[0-9]\\\\[0-9]" file.txt,甚至只是grep "\\\\[0-9]" file.txt,无论我如何尝试转义反斜杠,grep 都不起作用。

我可以将grep 替换为"[0-9$]",这似乎有点牵强,但我更希望能够包含斜线。我正在使用 Korn shell。任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: linux date ksh backslash


    【解决方案1】:

    Ksh 正则表达式

    Ksh 有它自己的正则表达式。 对任何字符串使用 *。因此,要获取所有以 .c 结尾的文件,请使用 *.c。 单个字符用 ? 表示。因此,所有以任何符号开头后跟 44.f 的文件都可以通过以下方式获取:?44.f.

    尤其是在 ksh 中,有整个模式的量词:

    ?(pattern) 匹配模式的零或一倍。 *(pattern) 匹配模式的任何时间。 +(pattern) 匹配模式一次或多次。 @(pattern) 匹配一次模式。 !(pattern) 匹配没有模式的字符串。

    因此可以质疑变量中的字符串,例如:if [[ $var = fo@(?4*67).c ]];then ...

    参考 here。 也许 this link 也会有所帮助。

    编辑:

    看看这是否适合你:

    grep '[[:digit:]]\{2\}\\[[:digit:]]\{2\}\\[[:digit:]]\{4\}' file.txt
    

    【讨论】:

    • 感谢您的回复,但我尝试了您的解决方案,但没有成功。
    【解决方案2】:

    您的第一次尝试只查找 1 位数字

    grep "[0-9]\\\\[0-9]\\\\[0-9]" file.txt # wrong, looks for only 1 digit between 2 \
    

    尝试一下:

    grep '[0-9]\\[0-9][0-9]\\[0-9]' file.txt
    

    现在如果日期总是 mm\dd\yyyy 并且在行尾,你应该 grep:

    grep '[0-9][0-9]\\[0-9][0-9]\\[0-9][0-9][0-9][0-9]$' file.txt
    

    治疗示例:

    sed -e 's/[0-9][0-9]\\[0-9][0-9]\\[0-9][0-9][0-9][0-9]$/___&___/' < file.txt
    

    将显示文件,并在行尾的日期前后放置“___”

    【讨论】:

    • 感谢您的回复。我尝试了 grep 命令,但它们仍然不起作用。我没有得到任何输出。 sed 命令给了我一个错误。未终止的 s 命令。不过,不要在日期周围加上引号。只想要在行尾有日期的所有行。
    • s 命令在我的示例中终止。使用单引号或双引号对命令很重要。保留正确数量的参数,有时还保护对空格和特殊字符的解释。只需复制整行并粘贴即可。
    • 一种可能是在 dste , l 之后有一些东西(空格?或 ^M 如果您在 linux 上处理在 Windows 上创建的文件?)。在这种情况下,删除“$”(行尾锚点)并这样做:sed -e 's/[0-9][0-9]\\[0-9][0-9]\\[0-9][0-9][0-9][0-9]/___&amp;___/g' &lt; file.txt(替换行中任何位置的日期。我删除了 $ 并添加了 g 以允许多次替换)
    猜你喜欢
    • 2023-03-11
    • 2015-08-11
    • 2021-10-14
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多